RecycleView一个Adapter中使用多个不同Holder时 泛型参数冲突解决办法

方法一 :让不同holder继承于一个抽象Holder(最好设置泛型 这样可以为不同holder赋不同类型的数据)
如下


import android.view.View;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myapplication.date.FeedDate;

public abstract class BaseHolder<T> extends RecyclerView.ViewHolder{
    public BaseHolder(@NonNull View itemView) {
        super(itemView);
    }

    public abstract void bindData(T feedDate);
}

adapter中

@Override
    public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case FeedDate.VIEW_TYPE_IMAGE:
                return new FeedHolder2(LayoutInflater.from(mContext).inflate(R.layout.feed_item_image, parent, false));
            case FeedDate.VIEW_TYPE_VIDEO:
                return new FeedHolder(LayoutInflater.from(mContext).inflate(R.layout.feed_item_video, parent, false));
            default:
                return new FeedHolder(LayoutInflater.from(mContext).inflate(R.layout.feed_item_video, parent, false));

        }
    }

    @Override
    public void onBindViewHolder(BaseHolder holder, int position) {

        holder.bindData(feedList.get(position));//如果不同holder需要传入的参数相同 那么仅此一行即可
    }

方法二: 直接强转

	if (holder instanceof FeedHolder) {
		((FeedHolder) holder).bindData(feedList.get(position));
	} else if (holder instanceof FeedHolder2) {
		((FeedHolder2) holder).bindData(feedList.get(position));
	}
好的,以下是一个使用 RecyclerView 和 RecyclerView.Adapter 的基本示例: 首先,在布局文件添加 RecyclerView: ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 接着,创建一个新的布局文件来定义每个子项的外观。例如,我们可以创建一个名为 `list_item.xml` 的文件: ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:orientation="vertical"> <TextView android:id="@+id/itemTitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold" /> <TextView android:id="@+id/itemSubtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="14sp" /> </LinearLayout> ``` 在这个示例布局,我们有一个垂直排列的 LinearLayout,其包含两个 TextView。这些 TextView 将在 RecyclerView 的每个项目显示。 接下来,我们需要创建一个 RecyclerView.Adapter 的子类来管理数据和绑定视图。例如,我们可以创建一个名为 `MyAdapter` 的类: ``` public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<String> mData; public MyAdapter(List<String> data) { this.mData = data; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { String item = mData.get(position); holder.titleTextView.setText(item); holder.subtitleTextView.setText("Subtitle for item #" + position); } @Override public int getItemCount() { return mData.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder { public TextView titleTextView; public TextView subtitleTextView; public MyViewHolder(View itemView) { super(itemView); titleTextView = itemView.findViewById(R.id.itemTitle); subtitleTextView = itemView.findViewById(R.id.itemSubtitle); } } } ``` 在这个示例适配器,我们有一个名为 `mData` 的字符串列表,它将存储要显示的数据。在 onCreateViewHolder() 方法,我们使用 LayoutInflater 加载 list_item.xml 布局文件,并将其传递给 MyViewHolder 的构造函数。MyViewHolder 类将用于存储每个子项的视图。在 onBindViewHolder() 方法,我们获取当前位置的数据并将其绑定到视图上。 最后,我们需要在活动或片段实例化 RecyclerView 和适配器。例如,我们可以创建一个名为 `MainActivity` 的类: ``` public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private MyAdapter mAdapter; private List<String> mData = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化数据 for (int i = 0; i < 20; i++) { mData.add("Item #" + i); } // 初始化 RecyclerView 和适配器 mRecyclerView = findViewById(R.id.recyclerView); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mAdapter = new MyAdapter(mData); mRecyclerView.setAdapter(mAdapter); } } ``` 在这个示例活动,我们首先初始化要显示的数据。然后,我们实例化 RecyclerView 和适配器,并将其设置为垂直线性布局。最后,我们将适配器设置为 RecyclerView。 这就是使用 RecyclerView 和 RecyclerView.Adapter 的基本示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值