一直纠结于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);
}
}
}