RecyclerView的局部刷新

一直纠结于RecyclerView的局部刷新,终于解决了.
因为要实现的效果要不断地去刷新item中的某些控件数据
所以使用notifydatachangedset(),notifyitemdatachangedset()
都很不理想,尤其是会影响item的点击事件。
思路:使用子线程对item进行不断地更新,因为使用了ViewHolder所以会回收view,所以在这块要记录他的可视范围数据下标和item下标。
具体看下面代码吧

package howie.refresh;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import butterknife.ButterKnife;
import butterknife.InjectView;
public class MainActivity extends AppCompatActivity {
    @InjectView(R.id.list) RecyclerView mListView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
        mListView.setLayoutManager(new LinearLayoutManager(this));
        mListView.setAdapter(new MAdapter(this));
        new Thread(runnable).start();
    }
    Handler demoHandler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==111){
                //可视范围内  item的具体下标(非回收后的)
                //首次 -1  -1
                int start = ((LinearLayoutManager)mListView.getLayoutManager()).findFirstVisibleItemPosition();
                int end = ((LinearLayoutManager)mListView.getLayoutManager()).findLastVisibleItemPosition();
                //mListView.getChildCount()
                //可视范围内的数量
                Log.e("start:",start+"");
                Log.e("last:",end+"");
                    for (int i = 0;i < mListView.getChildCount();i++){
                        if(start == -1){
                            continue;
                        }
                        if(start >= end){
                            break;
                        }
                        Log.e("start----:",start+"");
                        ViewGroup parent = (ViewGroup)mListView.getChildAt(i);
                        TextView tv = (TextView) parent.findViewById(R.id.tv);
                        tv.setText(start + "--");
                        start++;
                    }
            }
            postDelayed(runnable, 2000);
        }
    };

        Runnable runnable=new Runnable() {
            @Override
            public void run() {
                demoHandler.sendEmptyMessage(111);
            }
        };
    }
    class MAdapter extends RecyclerView.Adapter{
        private Context context;
        public MAdapter(Context context){
            this.context = context;
        }
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        }

        @Override
        public int getItemCount() {
            return 20;
        }
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
            return new Holder(view);
        }
        class Holder extends RecyclerView.ViewHolder{
            @InjectView(R.id.tv)
            TextView mTv;
            public Holder(View itemView) {
                super(itemView);
                ButterKnife.inject(itemView);
            }
        }
}

在此附上源码:
http://download.csdn.net/detail/u012790961/9455249

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView局部刷新闪烁是指在使用RecyclerView进行局部刷新时,界面出现明显的闪烁现象。这种现象通常是由于RecyclerViewItem刷新过程引起的,下面是一些可能导致RecyclerView局部刷新闪烁的原因和解决方法。 1. 数据源变化频繁:当RecyclerView的数据源频繁发生变化时,局部刷新可能会导致闪烁。解决办法可以是尽量减少数据源的变化,例如使用DiffUtil工具类来优化数据比较,只更新真正变化的Item。 2. ViewHolder的重用问题:如果RecyclerViewItem使用了动画效果,而在进行局部刷新时未正确处理ViewHolder的重用问题,可能会导致动画重复播放,从而产生闪烁。解决办法是在局部刷新的时候,清除或暂停动画效果,并正确处理ViewHolder的重用逻辑。 3. 刷新时的绘制问题:默认情况下,RecyclerView进行Item局部刷新时,会重新绘制整个Item View,这可能会导致闪烁。解决办法是通过重写Item View的onDraw()方法,在局部刷新时只绘制变化的部分,而不是整个Item View。 4. 使用过多的动画效果:如果RecyclerViewItem View使用了过多的动画效果,例如淡入淡出、旋转等,这些动画效果在局部刷新时会导致闪烁。解决办法是优化动画效果的使用,尽量减少动画效果的数量和复杂度。 总之,解决RecyclerView局部刷新闪烁问题的方法包括优化数据源的变化、正确处理ViewHolder的重用逻辑、优化绘制和动画效果的使用等。通过这些措施,可以有效减少RecyclerView局部刷新闪烁的现象,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值