This is my recyclerview Adapter
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView memeImageView;
ImageButton shareBtn, downLoadBtn;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
memeImageView=itemView.findViewById(R.id.memeImageViewId);
shareBtn = itemView.findViewById(R.id.shareBtnId);
downLoadBtn=itemView.findViewById(R.id.downloadBtnId);
}
}
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
private List <MyItem> myList;
private Context context;
public MyAdapter(List<MyItem> myList, Context context) {
this.myList = myList;
this.context = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.rowlayout,parent,false);
MyViewHolder VH = new MyViewHolder(v);
return VH;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
final MyItem myItemPosition = myList.get(position);
int itemPosition = position;
Glide.with(context).load(myItemPosition.getImageUrl()).into(holder.memeImageView);
holder.downLoadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context,HomeActivity.class);
intent.putIntegerArrayListExtra("itemPosition",myItemPosition);
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return myList.size();
}
}
HomeActivity.Java this is my main activity code
public class HomeActivity extends AppCompatActivity {
ImageView memeImage;
private OutputStream outputStream;
private File dir;
private Intent intent;
private final static int CODE = 100;
ProgressBar progressBar;
ShimmerFrameLayout shimmerFrameLayout;
RecyclerView recyclerView;
ImageButton downloadBtn, shareBtn;
String url= "https://api.npoint.io/31a57e2cfcbddb1a1bb5";
MyAdapter myAdapter;
List<MyItem> listItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
ActionBar actionbar = getSupportActionBar();
ColorDrawable colorDrawable = new ColorDrawable(Color.parseColor("#000000"));
assert actionbar != null;
actionbar.setBackgroundDrawable(colorDrawable);
getSupportActionBar().setTitle("Dank Meme Factory");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
progressBar=findViewById(R.id.progressBarId);
shareBtn=findViewById(R.id.shareBtnId);
downloadBtn=findViewById(R.id.downloadBtnId);
memeImage=findViewById(R.id.memeImageViewId);
int location = getIntent().getExtras().getInt("itemPosition");
recyclerView = findViewById(R.id.recyclerViewId);
shimmerFrameLayout = findViewById(R.id.shimmer);
shimmerFrameLayout.startShimmer();
listItems = new ArrayList<>();
recyclerView.setLayoutManager(new LinearLayoutManager(this));
loadData();
downloadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(HomeActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
download();
}else {
askPermission();
}
}
});
shareBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
share();
}
});
}
//This method will share the image
private void share() {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
BitmapDrawable drawable = (BitmapDrawable) memeImage.getDrawable();
Bitmap bitmap = drawable.getBitmap();
File file = new File(getExternalCacheDir()+"/"+getResources().getString(R.string.app_name)+".jpg");
try {
outputStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
outputStream.flush();
outputStream.close();
intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
startActivity(Intent.createChooser(intent,"Share image "));
}
// This method is used to download Image
private void download() {
dir=new File(Environment.getExternalStorageDirectory(),"DownloadImage");
if (!dir.exists()){
dir.mkdir();
}
BitmapDrawable drawable = (BitmapDrawable) memeImage.getDrawable();
Bitmap bitmap = drawable.getBitmap();
File file = new File(dir, System.currentTimeMillis() + ".jpg");
try {
outputStream = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
Toast.makeText(this, "Successfully Saved", Toast.LENGTH_SHORT).show();
try {
outputStream.flush();
outputStream.close();
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));
sendBroadcast(intent);
} catch (IOException e) {
e.printStackTrace();
}
//this intent will help to save image to gallery
}
private void askPermission() {
ActivityCompat.requestPermissions(HomeActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (CODE == requestCode){
if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
download();
}else {
Toast.makeText(HomeActivity.this,"Please Provide the Permission",Toast.LENGTH_SHORT).show();
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
public void loadData (){
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray array = jsonObject.getJSONArray("memes");
for (int i = 0; i < array.length(); i++) {
JSONObject receive = array.getJSONObject(i);
MyItem item = new MyItem(
receive.getString("url")
);
listItems.add(item);
}
shimmerFrameLayout.stopShimmer();
shimmerFrameLayout.setVisibility(View.GONE);
recyclerView.setVisibility(View.VISIBLE);
myAdapter = new MyAdapter(listItems,getApplicationContext());
recyclerView.setAdapter(myAdapter);
}catch (JSONException e){
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(HomeActivity.this,"Server Error",Toast.LENGTH_SHORT).show();
}
});
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(stringRequest);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuinflater = getMenuInflater();
menuinflater.inflate(R.menu.toolbar_menu,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId()==R.id.about_item){
Toast.makeText(this,"You have selected about item",Toast.LENGTH_SHORT).show();
return true;
}else if (item.getItemId()==R.id.more_apps_item){
Toast.makeText(this,"You have selected more apps item",Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
}
LogCat error
1.
2022-09-09 04:47:48.988 16392-16392/? E/dankmemefactor: Unknown bits set in runtime_flags: 0x40000000 2022-09-09 04:47:50.277
16392-16392/com.redge.dankmemefactory
E/OplusCustomizeRestrictionManager: sInstance is null, start a new
sInstance 2022-09-09 04:47:50.455
16392-16392/com.redge.dankmemefactory E/dankmemefactor: ofbOpen
failed with error=No such file or directory 2022-09-09 04:47:50.455 16392-16392/com.redge.dankmemefactory E/dankmemefactor: sysOpen
failed with error=No such file or directory 2022-09-09 04:47:51.605 16392-16489/com.redge.dankmemefactory E/OpenGLRenderer: Device claims wide gamut support, cannot find matching config, error = EGL_SUCCESS 2022-09-09 04:47:51.646 16392-16489/com.redge.dankmemefactory E/ion: ioctl c0044901 failed with code -1: Invalid argument 2022-09-09 04:47:51.703 16392-16489/com.redge.dankmemefactory E/OpenGLRenderer:
fbcNotifyFrameComplete error: undefined symbol:
fbcNotifyFrameComplete 2022-09-09 04:47:51.703
16392-16489/com.redge.dankmemefactory E/OpenGLRenderer:
fbcNotifyNoRender error: undefined symbol: fbcNotifyNoRender
2022-09-09 04:47:54.522 16392-16392/com.redge.dankmemefactory
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.redge.dankmemefactory, PID: 16392 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.redge.dankmemefactory/com.redge.dankmemefactory.HomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3815) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3977) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:109) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2374) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:233) at android.os.Looper.loop(Looper.java:344) at android.app.ActivityThread.main(ActivityThread.java:8248) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:589) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1071) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference at com.redge.dankmemefactory.HomeActivity.onCreate(HomeActivity.java:97) at android.app.Activity.performCreate(Activity.java:8130) at android.app.Activity.performCreate(Activity.java:8110) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1343) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3781) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3977) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:109) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2374) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:233) at android.os.Looper.loop(Looper.java:344) at android.app.ActivityThread.main(ActivityThread.java:8248) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:589) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1071)
What am I doing wrong here?