简体   繁体   中英

How to show 2 adapter in one recyclerview in mainactivity?

I have 2 adapter and I want to show 2 adapter in one recycelrview. for example, i have one adapter for post with image and another i have one adapter for post without image. I want to show both adapter post with image and post without image, i try some and my code is below.

This is my MainActivity.

 //with image
  private List<ModelPostImage> postImageList;
  private AdapterImage adapterImage;

 //without image
private List<ModelPost> postList;
private AdapterPost adapterPost;

//load posts
 loadPostWithImage();
 loadPostWithoutImage();

 //loadWithImage
 private void loadPostWithImage() {
    DatabaseReference ref 
 FirebaseDatabase.getInstance().getReference("postImage");
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            postImageList.clear();
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                ModelPostImage modelPostImage= 
                   ds.getValue(ModelPostImage.class);

                postImageList.add(modelPostImage);
                adapterImage= new AdapterImage(MainActivity.this, 
                 postImageList);
                //set adapter to RecyclerView
                recyclerView.setAdapter(adapterImage);


            }

        }

  //loadWithoutImage
   private void loadPostWithoutImage() {
    DatabaseReference ref 
 FirebaseDatabase.getInstance().getReference("Posts");
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            postList.clear();
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                ModelPost modelPost= 
                   ds.getValue(ModelPost.class);

                postList.add(modelPost);
                adapterPost = new AdapterPost(MainActivity.this, 
                 postList);
                //set adapter to RecyclerView
                recyclerView.setAdapter(adapterPost);

it does not show post with image, what should i do?

Use 2 kinds of ViewHolder for the RecyclerView Adapter instead of having 2 Adapters in 1 RecyclerView

You can also have more information on how to use RecyclerView correctly here. https://guides.codepath.com/android/using-the-recyclerview

I don't think you can use 2 adapters on one recyclerview but what you can do is you can create multiple viewholder types for your adapter for different types of layout. You can check this out https://stackoverflow.com/a/58160491/8300303

Instead of using two adapters in one RecyclerView , you can add one or more views in an adapter at one time. You just override getItemViewType() method in your adapter like this:

@Override
public int getItemViewType(int position)
{
   if(position==0)
     return LAYOUT_ONE;
   else
     return LAYOUT_TWO;
} 

and you can add your views in onCreateViewHolder like this:

@Override
   public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

      View view =null;
      RecyclerView.ViewHolder viewHolder = null;

      if(viewType==LAYOUT_ONE)
      {
          view = LayoutInflater.from(parent.getContext()).inflate(R.layout.one,parent,false);
          viewHolder = new ViewHolderOne(view);
      }
      else
      {
          view = LayoutInflater.from(parent.getContext()).inflate(R.layout.two,parent,false);
          viewHolder= new ViewHolderTwo(view);
      }

      return viewHolder;
   }

and in onBindViewHolder() do something like this:

    @Override
       public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

          if(holder.getItemViewType()== LAYOUT_ONE)
          {
                // Typecast Viewholder 
                // Set Viewholder properties 
                // Add any click listener if any 
          }
          else {

            ViewHolderOne vaultItemHolder = (ViewHolderOne) holder;
            vaultItemHolder.name.setText(displayText);
            vaultItemHolder.name.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                .......
               }
             });

           }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM