实现RecycleView动态使列表item可以点击或不可点击切换

本文介绍如何在Android应用中使用自定义Adapter为RecyclerView的项及子控件添加点击和长按事件,包括设置点击监听器的方法及如何切换点击状态。

效果

这里讲的是第二个button跳转的Activity,这里和上一篇不同之处在于可以item点击、item子控件点击

image

继承BaseAdapter

同样也要继承BaseAdapter

public class ADUadapter extends BaseAdapter<ChatModel> {
    public Context context;
    protected ADUholder holder;

    public ADUadapter(Context context) {
        super();
        this.context = context;
    }

    @Override
    protected void setItemChildListener(BaseViewHolder viewHolder) {
        super.setItemChildListener(viewHolder);
        if (viewHolder instanceof ADUholder){
            ADUholder adUholder = (ADUholder) viewHolder;
            baseViewHolderHelper.setItemChildClickListener(adUholder.imageView);
        }
    }

    @Override
    protected BaseViewHolder addViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
        return new ADUholder(view);
    }

    @Override
    protected void fillData(RecyclerView.ViewHolder holder, final int position, final ChatModel item) {
        this.holder = (ADUholder) holder;
        this.holder.title.setText(item.name);
        this.holder.name.setText(item.mMsg);
    }
}
重写setItemChildListener()

这里可以实现item子控件的点击效果,我们仅仅需要baseViewHolderHelper.setItemChildClickListener(adUholder.imageView);这里的参数就是我们让该控件实现点击效果。

在Activity中实现GIF中的效果

实现item点击效果

adUadapter.setOnItemClickListener(new BaseViewHolder.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(UpdataItemActivity.this, "position: " + position, Toast.LENGTH_SHORT).show();
            }
        });

实现item长按效果

adUadapter.setOnLongItemClickListener(new BaseViewHolder.OnLongItemClickListener() {
            @Override
            public boolean onLongItemClick(View view, int position) {
                String title = adUadapter.getItem(position).name;
                Toast.makeText(UpdataItemActivity.this, title + ",position: " + position, Toast.LENGTH_SHORT).show();
                return true;
            }
        });

实现item子控件点击效果

adUadapter.setOnChildItemClickListener(new BaseViewHolderHelper.OnChildItemClickListener() {
            @Override
            public void onChildItemClick(View view, int position) {
                String title = adUadapter.getItem(position).name;
                Toast.makeText(UpdataItemActivity.this, title + ",你点了图片,position: " + position, Toast.LENGTH_SHORT).show();
            }
        });

实现item点击或不可点击切换

rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                if (i == R.id.radioButton) {
                    adUadapter.getViewHolder().setItemable(true, true);
                } else if (i == R.id.radioButton2) {
                    adUadapter.getViewHolder().setItemable(false, false);
                }
            }
        });

好了,在此附上github源码,喜欢的请start、fork。
https://github.com/DyncKathline/TestRecyclerView

转载请注明出处,谢谢!

<think>我们要创建一个RecyclerView的适配器,该适配器需要支持每个item点击事件。我们将通过以下步骤实现: 1. 创建一个自定义的适配器类,继承自RecyclerView.Adapter,并指定一个自定义的ViewHolder。 2. 在ViewHolder中设置item点击事件监听器。 3. 在适配器中暴露一个接口(如OnItemClickListener)用于回调点击事件。 4. 在适配器中设置一个监听器成员变量,并提供一个设置监听器的方法(者通过构造方法传入)。 下面是一个完整的实现示例: </think>以下是用 Java 实现RecyclerView 适配器,支持 item 点击响应: ```java import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { // 数据源 private List<String> dataList; // 点击事件监听接口 private OnItemClickListener onItemClickListener; // 构造函数 public MyAdapter(List<String> dataList) { this.dataList = dataList; } // 设置点击监听器 public void setOnItemClickListener(OnItemClickListener listener) { this.onItemClickListener = listener; } // 创建 ViewHolder @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 加载布局 View view = LayoutInflater.from(parent.getContext()) .inflate(android.R.layout.simple_list_item_1, parent, false); return new MyViewHolder(view); } // 绑定数据到 ViewHolder @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { // 获取当前位置的数据 String item = dataList.get(position); // 设置文本 holder.textView.setText(item); // 设置点击事件 holder.itemView.setOnClickListener(v -> { if (onItemClickListener != null) { // 传递位置和数据 onItemClickListener.onItemClick(position, item); } }); } // 返回数据数量 @Override public int getItemCount() { return dataList.size(); } // 自定义 ViewHolder static class MyViewHolder extends RecyclerView.ViewHolder { TextView textView; public MyViewHolder(@NonNull View itemView) { super(itemView); // 获取布局中的视图 textView = itemView.findViewById(android.R.id.text1); } } // 点击事件接口 public interface OnItemClickListener { void onItemClick(int position, String item); } } ``` ### 使用方法: 1. **在 Activity/Fragment 中使用适配器**: ```java public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 创建示例数据 List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3", "Item 4"); // 创建适配器 MyAdapter adapter = new MyAdapter(data); // 设置点击监听器 adapter.setOnItemClickListener((position, item) -> { Toast.makeText(MainActivity.this, "点击了: " + item + " 位置: " + position, Toast.LENGTH_SHORT).show(); }); // 设置适配器 recyclerView.setAdapter(adapter); } } ``` 2. **XML 布局文件示例**: ```xml <!-- activity_main.xml --> <androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` ### 代码解释: 1. **适配器结构**: - 继承自 `RecyclerView.Adapter` 并指定自定义的 `ViewHolder` - 包含数据源 `List<String> dataList` - 定义点击事件接口 `OnItemClickListener` 2. **ViewHolder 实现**: - 内部静态类 `MyViewHolder` 继承自 `RecyclerView.ViewHolder` - 在构造方法中获取视图组件引用 - 使用 Android 内置布局 `simple_list_item_1`(包含一个 TextView) 3. **点击事件处理**: - `setOnItemClickListener()` 方法设置外部监听器 - 在 `onBindViewHolder()` 中为每个 item 设置点击监听 - 点击时通过接口回调位置和数据 4. **关键方法**: - `onCreateViewHolder()`:创建视图并封装到 ViewHolder - `onBindViewHolder()`:绑定数据到视图并设置事件 - `getItemCount()`:返回数据项数量 ### 高级功能扩展: 1. **添加长按事件**: ```java // 在适配器中添加接口 public interface OnItemLongClickListener { boolean onItemLongClick(int position, String item); } // 在 onBindViewHolder 中添加 holder.itemView.setOnLongClickListener(v -> { if (onItemLongClickListener != null) { return onItemLongClickListener.onItemLongClick(position, item); } return false; }); ``` 2. **支持多种视图类型**: ```java @Override public int getItemViewType(int position) { // 根据数据返回不同的视图类型 return dataList.get(position).startsWith("Header") ? 0 : 1; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 根据视图类型加载不同布局 int layoutRes = viewType == 0 ? R.layout.header_item : android.R.layout.simple_list_item_1; View view = LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false); return new MyViewHolder(view); } ``` 3. **DiffUtil 优化刷新**(API 24+): ```java public void updateData(List<String> newData) { DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff( new MyDiffCallback(this.dataList, newData)); this.dataList = newData; diffResult.dispatchUpdatesTo(this); } static class MyDiffCallback extends DiffUtil.Callback { // 实现 DiffUtil.Callback 的方法 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值