Pawel
Pawel

Reputation: 57

One RecyclerAdapter for two activity

I make app with a couple of different categories of pictures. I want to display those pictures with RecyclerView.

I want to display button as a image when I clicked button before. Can I make it in one adapter? Now I have two adapters, that code is as follow:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private int[] images = {
   R.drawable.imageA1, ....    R.drawable.imageA10
};
private int[] images2 = {
        R.drawable.imageB1, ....    R.drawable.imageB10
  };

class ViewHolder extends RecyclerView.ViewHolder{

    public int currentItem;
    public ImageView itemImage, itemImage2;
    public TextView itemTitle;

    public ViewHolder(View itemView) {
        super(itemView);
        itemImage = (ImageView)itemView.findViewById(R.id.imageView);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.article_layout, viewGroup, false);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    viewHolder.itemImage.setImageResource(images[i]);
     }
@Override
public int getItemCount() {
    return images.length;
}

}

Upvotes: 0

Views: 1522

Answers (3)

aj0822ArpitJoshi
aj0822ArpitJoshi

Reputation: 1182

Yes possible. make constructor in adpater like that:

 public  RecyclerAdapter(Context context,int[] images)
{
    this.diff_images=images;
    this.context=context;

}

the diff_images is also int array in adapter class. and make images array in your activity class. when you press button one then pass image1 array in adpater and if when press button2 then pass image2 array (if your want to show same view for both cases and if you want to show different view for both images)
if your adapter already set like:

    recycleViewAdapter = new RecyclerAdapter(this, imageArray);
    recyclerView.setAdapter(recycleViewAdapter);

then you can also make one more method in adapter class and only notify adapter for update image

  public void setNewImageList(Context context, int[] imageArray) {
    this.context = context;
    this.diff_images = imageArray;
    notifyDataSetChanged();
}

try this.

Upvotes: 0

JoKr
JoKr

Reputation: 5256

You can set method in adapter that you will call when users clicks button:

// for button A
public void setImages() { 
  this.showImages = true;
}

// for button B
public void setImages2() {
  this.showImages = false;
}

Then modify your on bind method to bind appropriate images:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    if (this.showImages)
        viewHolder.itemImage.setImageResource(images[i]);
    else
        viewHolder.itemImage.setImageResource(images2[i]);
    }  

Upvotes: 1

Divyang Panchal
Divyang Panchal

Reputation: 1909

You need to pass images array dynamically to your adapter as below

private int[] images = {
   R.drawable.imageA1, ....    R.drawable.imageA10
};
private int[] images2 = {
        R.drawable.imageB1, ....    R.drawable.imageB10
  };

on click of button A

RecyclerAdapter myAdapter = new RecyclerAdapter(images)
yourRecyclerview.setAdapter(myAdapter )

on click of button B

RecyclerAdapter myAdapter = new RecyclerAdapter(images2)
yourRecyclerview.setAdapter(myAdapter )

change in your adapter as following

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private int[] images = new int[];

public RecyclerAdapter(int[] imgs){
images = imgs;
}

class ViewHolder extends RecyclerView.ViewHolder{

    public int currentItem;
    public ImageView itemImage, itemImage2;
    public TextView itemTitle;

    public ViewHolder(View itemView) {
        super(itemView);
        itemImage = (ImageView)itemView.findViewById(R.id.imageView);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.article_layout, viewGroup, false);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    viewHolder.itemImage.setImageResource(images[i]);
     }
@Override
public int getItemCount() {
    return images.length;
}
}

Upvotes: 0

Related Questions