Reputation: 53
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?
Upvotes: 0
Views: 525
Reputation: 1
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) {
.......
}
});
}
}
Upvotes: 0
Reputation: 176
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
Upvotes: 1
Reputation: 76
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
Upvotes: 2