解决RecyclerView点击一个item,后面每间隔9个item就会触发一次同样的事件的问题

本文解决了一个常见的RecyclerView性能问题,即点击事件错误地在每隔几个item上重复触发。通过调整缓存大小,可以避免item的重复复用,确保点击事件只在目标item上生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不知道大家有没有遇到这种情况,当你通过点击事件改变第一个item的状态之后,向下滑动到第10个item也会同样触发,然后第19、28、37、46等等,每间隔9个item就会重复之前的操作后的显示状态。
如何解决呢?其实就是一个缓存的问题,只要在recyclerview相应的activity或者fragment中设置
recyclerview.setItemViewCacheSize(int)
int是缓存数,默认值为5,每间隔(4+5)个item就会进行复用,如果你把它设为10,那么每间隔(4+10)个item就会复用,你只要把int的值设为:【item数 - 4】即可!

<think>我们正在实现一个RecyclerView列表,每行显示文本和右侧箭头,点击跳转到另一个Activity。 步骤: 1. 准备数据源(字符串列表) 2. 创建RecyclerViewItem布局(包含一个TextView和一个ImageView作为箭头) 3. 创建Adapter和ViewHolder 4. 在Activity中设置RecyclerView(包括LayoutManager和Adapter) 5. 实现点击事件:在Adapter中为每个Item设置点击监听,点击时跳转到目标Activity 注意:这里我们使用RecyclerView来实现,因为RecyclerView是ListView的升级版,具有更好的性能和灵活性[^1]。 具体实现如下:</think>### Android JavaRecyclerView列表显示文本和右侧箭头(点击跳转Activity) #### 一、实现步骤概览 1. **创建列表项布局**(含文本和箭头) 2. **建立数据模型** 3. **实现RecyclerView适配器** 4. **设置点击跳转逻辑** 5. **在Activity中配置RecyclerView** #### 二、完整实现代码 ##### 1. 列表项布局 (`item_list.xml`) ```xml <!-- res/layout/item_list.xml --> <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" app:cardElevation="4dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="16dp" android:clickable="true" android:focusable="true"> <TextView android:id="@+id/tvItemText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="18sp" android:textColor="@color/black"/> <ImageView android:id="@+id/ivArrow" android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/ic_arrow_right" <!-- 准备向右箭头图标 --> android:contentDescription="跳转箭头"/> </LinearLayout> </androidx.cardview.widget.CardView> ``` ##### 2. 数据模型类 ```java public class ListItem { private String title; private Class<?> targetActivity; // 目标Activity类 public ListItem(String title, Class<?> targetActivity) { this.title = title; this.targetActivity = targetActivity; } // Getters public String getTitle() { return title; } public Class<?> getTargetActivity() { return targetActivity; } } ``` ##### 3. 适配器实现 (Adapter) ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private final List<ListItem> dataList; private final Context context; public MyAdapter(Context context, List<ListItem> dataList) { this.context = context; this.dataList = dataList; } public static class ViewHolder extends RecyclerView.ViewHolder { TextView tvText; ImageView ivArrow; public ViewHolder(View itemView) { super(itemView); tvText = itemView.findViewById(R.id.tvItemText); ivArrow = itemView.findViewById(R.id.ivArrow); } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_list, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { ListItem item = dataList.get(position); holder.tvText.setText(item.getTitle()); // 设置点击事件 holder.itemView.setOnClickListener(v -> { Intent intent = new Intent(context, item.getTargetActivity()); context.startActivity(intent); // 添加跳转动画 if (context instanceof Activity) { ((Activity) context).overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_left); } }); } @Override public int getItemCount() { return dataList.size(); } } ``` ##### 4. Activity中配置RecyclerView ```java public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化Toolbar(可选) Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // 配置RecyclerView recyclerView = findViewById(R.id.rvList); recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 准备数据 List<ListItem> items = new ArrayList<>(); items.add(new ListItem("设置", SettingsActivity.class)); items.add(new ListItem("个人资料", ProfileActivity.class)); items.add(new ListItem("消息中心", MessageActivity.class)); // 设置适配器 MyAdapter adapter = new MyAdapter(this, items); recyclerView.setAdapter(adapter); // 添加分割线 recyclerView.addItemDecoration(new DividerItemDecoration( this, DividerItemDecoration.VERTICAL)); } } ``` #### 三、关键优化点 1. **跳转动画效果**(创建动画资源): ```xml <!-- res/anim/slide_in_right.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="100%" android:toXDelta="0" android:duration="300"/> </set> <!-- res/anim/slide_out_left.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="-100%" android:duration="300"/> </set> ``` 2. **防止快速重复点击**: ```java // 在适配器中添加防抖机制 private long lastClickTime = 0; private static final long CLICK_DELAY = 500; // 500毫秒间隔 // 修改点击事件处理 holder.itemView.setOnClickListener(v -> { long currentTime = SystemClock.elapsedRealtime(); if (currentTime - lastClickTime < CLICK_DELAY) return; lastClickTime = currentTime; // ...跳转逻辑 }); ``` 3. **导航栏整合**(参考引用[3]): ```java // 在onCreate中配置导航抽屉 mDrawerLayout = findViewById(R.id.drawer); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer); } ``` #### 四、效果说明 实现功能 | 实现方式 | 用户交互效果 ---|---|--- 文本显示 | `TextView` | 左侧显示标题文本 箭头图标 | `ImageView` | 右侧显示跳转指示 点击跳转 | `setOnClickListener` | 点击整行触发跳转 跳转动效 | `overridePendingTransition` | 平滑的右滑进入效果 导航整合 | `Toolbar + DrawerLayout` | 支持侧滑菜单[^3] > **注意**:RecyclerView通过RecycleBin机制高效管理视图内存,即使处理大量数据也不会OOM[^1]。使用`CardView`可增强列表项的立体感和点击反馈。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值