2023年7月15日发(作者:)
RecycleView嵌套与多级列表布局⽂件主界⾯布局 主RecycleView的Item的布局的Item的布局 ⼦RecycleView的Item的布局的Item的布局 这玩意就不多说了,主要讲嵌套中会出现的问题主RecycleView的适配器 public class CustomAdapter extends r { private Context context; private List data; CustomAdapter(Context context, List data) { t = context; = data; } @Override public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new CustomViewHolder((context).inflate(_for_recycleview, parent, false)); } @Override public void onBindViewHolder(final CustomViewHolder holder, final int position) { t((position)); if (onItemClickListener != null) { lickListener(new kListener() { @Override public void onClick(View view) { Log.e("xxx", clable() + ""); int pos = outPosition(); Click(holder, pos); ecyclable(false);//view复⽤造成⼀处点击多处响应的问题 设置为被点击的item不可以被复⽤, Log.e("xxx", clable() + ""); } }); } } @Override public int getItemCount() { return (); } void setOnItemClickListener(OnItemClickListener itemClickListener) { ClickListener = itemClickListener; } private OnItemClickListener onItemClickListener; interface OnItemClickListener { void onItemClick(CustomViewHolder holder, int position); } }问题1:点击RecycleView中的某个Item会出现多个Item响应的问题,可能有规律。解决:RecycleView中的点击事件不要直接在Adapter中实现,通过回调传⼊在外部实现,回调接⼝中参数为ViewHolder是应为某些情况下点击事件有⼀个控件响应之后去修改其他控件的内容。可以修改为对应View问题2:点击⼀个RecycleView中的Item展开其次级列表时后⾯的Item也会复⽤当前已经展开的Item(这个跟上⾯有点类似)解决: 这⾥解决⽅案⽐较多设置Tag之类的都是可⾏的,究其原理⽆⾮是展开的Item不进⾏复⽤,这⾥采⽤的⽅式是直接设置Item不可复⽤ecyclable(false);这⾥仅仅对单个已经点击的item有效,⽽且当该item画出屏幕外再次滑动回到屏幕内时其复⽤状态会重新更新为可以复⽤,可以看到代码中的两个Log,当Item出现在屏幕内⾸次点击之前该Item都是可以复⽤的,对性能影响较⼩。这⾥滑动冲突不需要进⾏处理,应为RecycleView布局使⽤的是android:layout_height="wrap_content"如果各位在且套的时候要求内部⼦RecycleView长度固定且可以滑动就需要通过setScrollEnabled处理滑动冲突,(额,直说吧这⾥我根本没尝试...)MainActivity代码public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_main); initView(); } List getData() { ArrayList strings = new ArrayList<>(); for (int i = 0; i < 100; i++) { ("i=" + i); } return strings; } List getData2Inner() { ArrayList strings = new ArrayList<>(); for (int i = 0; i < 5; i++) { ("i=" + i); } return strings; } void initView() { RecyclerView recyclerView = findViewById(eView); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); entation(AL); final CustomAdapter adapter = new CustomAdapter(this, getData()); temClickListener(new ClickListener() { @Override public void onItemClick(CustomViewHolder holder, int position) { LinearLayoutManager llm = new LinearLayoutManager(); entation(AL); InnerAdapter innerAdapter = new InnerAdapter(, getData2Inner()); outManager(llm); pter(innerAdapter); Params layoutParams = outParams(); = 0; outParams(layoutParams); outParams(layoutParams); startAnimation(Layout); } }); pter(adapter); outManager(linearLayoutManager); } public void startAnimation(final View view) { ValueAnimator animator; if (ght() == 0) { animator = (0, getMeasureHeight(view)); ateListener(new orUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Params layoutParams = outParams(); = (int) matedValue(); outParams(layoutParams); } }); } else {//if (ght() == getMeasureHeight(view)) animator = (ght(), 0); ateListener(new orUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Params layoutParams = outParams(); = (int) matedValue(); outParams(layoutParams); } }); } ation(1000); (); } /** * 测量控件的显⽰的时候的真实⾼度 * * @param view target view * @return target view real height */ public int getMeasureHeight(View view) { int w = asureSpec(0, IFIED); int h = asureSpec(0, IFIED); e(w, h); return suredHeight(); }}其他ViewHolder和⼦Adapter就不贴了,没有什么需要注意的地⽅改怎么写就怎么写
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689425613a246204.html
评论列表(0条)