Как показать 2 адаптера в одном обзоре в основном режиме? - PullRequest
0 голосов
/ 14 октября 2019

У меня есть 2 адаптера, и я хочу показать 2 адаптера в одном recycelrview. Например, у меня есть один адаптер для публикации с изображением, а другой у меня есть один адаптер для публикации без изображения. Я хочу показать как сообщение адаптера с изображением, так и сообщение без изображения, я пробую его, и мой код приведен ниже.

Это моя основная активность.

 //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);

она не показывает сообщение с изображениемчто мне делать?

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Используйте 2 вида ViewHolder для адаптера RecyclerView вместо двух адаптеров в 1 RecyclerView

Вы также можете получить дополнительную информацию о том, как правильно использовать RecyclerView здесь. https://guides.codepath.com/android/using-the-recyclerview

1 голос
/ 14 октября 2019

Я не думаю, что вы можете использовать 2 адаптера в одном представлении переработчика, но вы можете создать несколько типов держателей для вашего адаптера для разных типов макетов. Вы можете проверить это https://stackoverflow.com/a/58160491/8300303

0 голосов
/ 14 октября 2019

Вместо использования двух адаптеров в одном 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() doкак то так:

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

           }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...