【问题标题】:How to show 2 adapter in one recyclerview in mainactivity?如何在 mainactivity 的一个回收器视图中显示 2 个适配器?
【发布时间】:2019-10-14 01:31:13
【问题描述】:

我有 2 个适配器,我想在一个 recycelrview 中显示 2 个适配器。 例如,我有一个适配器用于带图像的帖子,另一个我有一个适配器用于不带图像的帖子。我想显示带有图像的适配器帖子和不带图像的帖子,我尝试了一些,我的代码如下。

这是我的 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);

它没有显示带有图像的帖子,我该怎么办?

【问题讨论】:

    标签: java android android-studio


    【解决方案1】:

    为 RecyclerView Adapter 使用 2 种 ViewHolder,而不是在 1 个 RecyclerView 中有 2 个 Adapter

    您还可以在此处获得有关如何正确使用 RecyclerView 的更多信息。 https://guides.codepath.com/android/using-the-recyclerview

    【讨论】:

    • 嗨,我已经初始化了我的 RecyclerView 我只显示需要的代码。当我打开我的应用程序时,我只看到没有图像的帖子,当我点击 profileactivity 并按下它现在只显示带有图像的帖子。
    【解决方案2】:

    我不认为你可以在一个 recyclerview 上使用 2 个适配器,但你可以做的是你可以为你的适配器为不同类型的布局创建多个 viewholder 类型。你可以看看这个https://stackoverflow.com/a/58160491/8300303

    【讨论】:

      【解决方案3】:

      您可以一次在一个适配器中添加一个或多个视图,而不是在一个 RecyclerView 中使用两个适配器。您只需在适配器中覆盖 getItemViewType() 方法,如下所示:

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

      您可以像这样在onCreateViewHolder 中添加您的观点:

      @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;
         }
      

      onBindViewHolder() 中做这样的事情:

          @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) {
                      .......
                     }
                   });
      
                 }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多