Android RecyclerView高效实现全部item倒计时
最近做一个比赛列表的需求,需实现每场比赛倒计时的功能。刚开始实现的思路是这样的:开一个线程,每秒钟循环取出每个item的剩余时间,然后减去1,再调用adapter.notifyDataSetChanged()方法去刷新列表,似乎不会感觉到卡。但注意到,每次调用notifyDataSetChanged()是整个页面都刷新的(其实我们只需要刷新每个item倒计时时间的TextView即可)。当item上添加了ImageView,并且图片是从网络上拉取下来的,偶现了图片一闪一闪的bug,这个问题是不可以容忍的。
再者,一个RecyclerView,每秒全部控件刷新一次,这样的做法确实不能让自己满意,性能上肯定会有一些问题,所以另寻思路。
最好的实现方式就是只刷新倒计时TextView的内容。因为RecyclerView的item是复用的,划出屏幕的item就被销毁了,所以我们无需对其操纵,也操纵不了。我们要做的就是只操纵屏幕上显示的item。废话不多说,直接附上代码:
1 package com.example.countdemo; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import android.app.Activity; 6 import android.os.Bundle; 7 import android.support.v7.widget.LinearLayoutManager; 8 import android.support.v7.widget.RecyclerView; 9 import android.support.v7.widget.RecyclerView.ViewHolder; 10 import android.view.LayoutInflater; 11 import android.view.View; 12 import android.view.ViewGroup; 13 import android.widget.TextView; 14 import com.example.countdemo.MainActivity.MAdapter.MViewHolder; 15 16 public class MainActivity extends Activity { 17 private RecyclerView recycleView; 18 private MAdapter adapter; 19 private LinearLayoutManager manager; 20 private List<Integer> myList = new ArrayList<Integer>(); 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_main); 25 initList(); 26 initView(); 27 } 28 private void initList(){ 29 for(int i = 100;i<130;i++){ 30 myList.add(i); 31 } 32 } 33 private void initView(){ 34 recycleView = (RecyclerView)findViewById(R.id.recycle); 35 manager = new LinearLayoutManager(this); 36 manager.setOrientation(LinearLayoutManager.VERTICAL); 37 recycleView.setLayoutManager(manager); 38 adapter = new MAdapter(myList); 39 recycleView.setAdapter(adapter); 40 new MyThread().start(); 41 } 42 class MyThread extends Thread{ 43 @Override 44 public void run() { 45 while(true){ 46 try { 47 Thread.sleep(1000); 48 } catch (InterruptedException e) { 49 e.printStackTrace(); 50 } 51 int firstVisible = manager.findFirstVisibleItemPosition(); 52 int lastVisible = manager.findLastVisibleItemPosition(); 53 for(int i =0;i<myList.size();i++){ 54 myList.set(i, myList.get(i)-1); 55 if(i>=firstVisible && i<=lastVisible){ 56 final MViewHolder vh = (MViewHolder) recycleView.findViewHolderForPosition(i); 57 final String text = myList.get(i)+""; 58 runOnUiThread(new Runnable() { 59 60 @Override 61 public void run() { 62 vh.text.setText(text); 63 } 64 }); 65 66 } 67 } 68 69 } 70 } 71 72 } 73 class MAdapter extends RecyclerView.Adapter<MAdapter.MViewHolder>{ 74 private LayoutInflater inflater; 75 private List<Integer> list; 76 public MAdapter(List<Integer> list) { 77 inflater = LayoutInflater.from(MainActivity.this); 78 this.list = list; 79 } 80 class MViewHolder extends ViewHolder{ 81 82 public MViewHolder(View itemView) { 83 super(itemView); 84 } 85 private TextView text; 86 } 87 @Override 88 public int getItemCount() { 89 return list.size(); 90 } 91 92 @Override 93 public void onBindViewHolder(MAdapter.MViewHolder holder, int position) { 94 holder.text.setText(list.get(position)+""); 95 } 96 97 @Override 98 public MAdapter.MViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 99 View view = inflater.inflate(R.layout.list_item, null); 100 MViewHolder holder = new MViewHolder(view); 101 holder.text = (TextView) view.findViewById(R.id.text); 102 return holder; 103 } 104 105 } 106 107 108 }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" > <android.support.v7.widget.RecyclerView android:id="@+id/recycle" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="90dp" android:textColor="#000000" android:textSize="20sp" android:text="456" android:gravity="center" /> </RelativeLayout>

至此,该功能已实现,附上源码地址,有需要的朋友可以下载后在自己的ide上跑起来,项目在eclipse中运行。第一篇博客,希望大家支持!
http://download.csdn.net/detail/cwx01perfect/9252441
浙公网安备 33010602011771号