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

posted on 2015-11-08 20:08  陈文新  阅读(2985)  评论(0)    收藏  举报

导航