现在开始解决问题。首先按照之前解释的逻辑,能够分辨出使用RecyclerView的时候出现显示错乱是因为复用问题。这里刚好对于问题进行解决。(这是在电视端开发,会有焦点的获取问题)

首先描述下问题。问题其实很简单,就是一个View的List里面每个item都有一个按钮控件,这个按钮可以显示开启或者关闭,这里首先产品的需求不明确,只给了几个设计图。

android recycleview不重用 recyclerview不复用item_Android

按钮大概长这样,就是遥控按一个按键删除按钮就要消失,再按一下又回来了。

由于刚入职不久,因此我对于RecyclerView的使用经验等于0,就按照ListView的流程建立完了整个RecyclerView。乍一看,嗯,挺不错的,功能实现了。但是我只是给每一个item加了个delete的button,然后回调事件到activity里面去,添加一个按钮控制事件打开关闭这个button,代码如下

holder.itemView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int keyCode, KeyEvent event) {
                LogFF.d("@ch onKeyDown keyCode = " + keyCode);
                if (event.getAction() == KeyEvent.ACTION_UP && event.getKeyCode()         
                   == KeyEvent.KEYCODE_MENU) {
                    //对单个选中的item做编辑或者删除操作
                    if(holder.mDeleteView.getVisibility() == View.VISIBLE){
                        holder.mDeleteView.setVisibility(View.INVISIBLE);
                    }else {
                        holder.mDeleteView.setVisibility(View.VISIBLE);
                    }
                    return true;
                }
                return false;
            }
        });

代码逻辑很简单,就是在按下按钮之后是否显示mDeleteView。但是在测试之后,发现出现了复用问题。第一个item打开mDeleteView之后,下拉发现第十六个item也打开了。一开始我一脸懵逼,这时候一位前辈随便瞄了一眼就说是复用问题。于是我乖乖去查复用的相关问题。果然找到了和我类似的情况

这位前辈就是下载按钮被复用的问题。然后这位前辈就介绍了一波源码,我前面讲源码有一部分知识就是从这里引申的。这位前辈用的就是正常的解决思路,把下载按钮和数据绑定起来。这样,你的onBindViewHolder,在这边是Convert,每次渲染item,就会去从你的bean去读取当前的状态和进度,为每一个下载按钮设置上属于它自己的状态和进度。这样就实现了一个进度和状态的同时绑定。

于是我这边要给每个item一个状态量buttonState,在初始化item的时候对buttonState进行读取,这个参数决定按钮是否显示。这样当然是正常解决思路。但是这时候另一位前辈又瞄了一眼我的代码。他说,你在焦点离开的时候就把删除按钮关掉不就行了吗?好像是这样哦,需求中给出的是可以打开删除按钮,但是焦点都不在按钮上了,那么删除按钮自然就没了。也就是说这样可以不用在意复用的问题。当然这种做法也仅限于很少一部分的情况,比如这里是需求没有定明确,如果需求中要求多个item可以同时打开删除按钮不关闭,那我啃呢个就要按照基本方法更改了。

这篇文章只写一半,先留个空给另一部分,异步加载图片的问题。我还想在学习一段时间再对这个部分进行分析。