zoukankan      html  css  js  c++  java
  • Android进阶笔记13:ListView篇之ListView刷新显示(全局 和 局部)

    一、ListView内容变化后,动态刷新的步骤(全局刷新)

    (1)更新适配器Adapter数据源;(不要使用匿名内部类

    (2)调用适配器Adapter的刷新方法notifyDataSetChanged();

    二、ListView中的单个item的数据变化后,动态刷新步骤(局部刷新):

    1、引言  

      有个下载模块,因为可能同时下载好几个数据,所以用的listview展示所有正在下载的内容。因为下载进度要实时更新,所以要不停的调用notifyDateSetChanged刷新数据。这样会不停的重新绘制整个listview的界面性能开销非常大。而且如果每个item有图片的话,每个item的图片都需要重新加载,就算图片做了内存缓存,刷新一下图片也会闪一下,不停的刷新就会导致各个item的图片不停的闪,体验一点都不好。

      那么对于上面问题,有没有解决办法呢?当然是有的。我们可以针对某一个item进行局部更新,而不影响其它没有修改的item

    2、下面我们来介绍一下如何对listView进行单条刷新:

      首先我们看一下adapter的getView方法,我们要进行单条刷新就要手动调用这个方法。

    public View getView(int position, View convertView, ViewGroup parent)

    那么这三个参数是如何确定的呢,第三个参数很好确定,就是你的listview

    为了确定另外两个参数position和converView,这里介绍几个lisView的新方法:

    getFirstVisiblePosition(),该方法获取当前状态下list的第一个可见item的position

    getLastVisiblePosition(),该方法获取当前状态下list的最后一个可见item的position

    getItemAtPosition(int position),该方法返回当前状态下position位置上listView的convertView

    ps:这里的convertView是复用的,也就是说不管position的值是多大(这个要看你整个list有多大),converView的个数应该始终是屏幕上能显示的list的条数那么多。

      所以,我们通过从getFirstVisiblePosition的值到getLastVisiblePosition的值之间的listitem和需要进行更新的条件(比如id)进行比较确定哪一个是要更新的(如果不在当前可是范围内也就没有必要更新了,等list拉动的时候自然就会更新出来)

    代码如下,其实这个方法是google 2011年开发者大会上提出的方法------ListView单条更新

     1 private void updateSingleRow(ListView listView, long id) { 
     2    
     3         if (listView != null) { 
     4             int start = listView.getFirstVisiblePosition(); 
     5             for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++) 
     6                 if (id == ((Messages) listView.getItemAtPosition(i)).getId()) { 
     7                     View view = listView.getChildAt(i - start); 
     8                     getView(i, view, listView); 
     9                     break; 
    10                 } 
    11         } 
    12     }

    3、下面当然要结合具体的案例说明ListView单条更新,具体流程如下:

    (1)新建一个Android工程,命名为"listviewUpdate",如下:

    (2)来到主布局文件activity_main.xml,如下:

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     tools:context=".MainActivity" >
     6 
     7     <ListView
     8         android:id="@+id/lv"
     9         android:layout_width="match_parent"
    10         android:layout_height="match_parent" >
    11     </ListView>
    12 
    13 </RelativeLayout>

    布局效果图,如下:

    ListView的Item的布局list_item.xml,如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical" >
     6 
     7     <TextView
     8         android:id="@+id/tv"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content"
    11         android:text="test"
    12         android:textColor="#ff000000" />
    13 
    14     <TextView
    15         android:id="@+id/tv1"
    16         android:layout_width="wrap_content"
    17         android:layout_height="wrap_content"
    18         android:layout_margin="20dp"
    19         android:text="bbb"
    20         android:textColor="#ff000000" />
    21 
    22 </LinearLayout>

    布局效果图,如下:

    (3)接下来,来到主界面MainActivity,如下:

      1 package com.example.listviewupdate;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 import android.app.Activity;
      7 import android.os.Bundle;
      8 import android.os.CountDownTimer;
      9 import android.view.Menu;
     10 import android.view.View;
     11 import android.view.ViewGroup;
     12 import android.widget.AdapterView;
     13 import android.widget.AdapterView.OnItemClickListener;
     14 import android.widget.BaseAdapter;
     15 import android.widget.ListView;
     16 import android.widget.TextView;
     17 
     18 public class MainActivity extends Activity implements OnItemClickListener {
     19 
     20     private static final String TAG = "MainActivity";
     21     private ListView lv;
     22     private List<String> list = new ArrayList<String>();
     23     private MyAdapter adapter;
     24 
     25     @Override
     26     protected void onCreate(Bundle savedInstanceState) {
     27         super.onCreate(savedInstanceState);
     28         setContentView(R.layout.activity_main);
     29         for (int i = 0; i < 55; i++) {
     30             list.add("======" + i);
     31         }
     32 
     33         lv = (ListView) findViewById(R.id.lv);
     34         lv.setOnItemClickListener(this);
     35         adapter = new MyAdapter();
     36         lv.setAdapter(adapter);
     37     }
     38 
     39     @Override
     40     public boolean onCreateOptionsMenu(Menu menu) {
     41         // Inflate the menu; this adds items to the action bar if it is present.
     42         getMenuInflater().inflate(R.menu.activity_main, menu);
     43         return true;
     44     }
     45 
     46     class MyAdapter extends BaseAdapter {
     47 
     48         @Override
     49         public int getCount() {
     50             return list.size();
     51         }
     52 
     53         @Override
     54         public Object getItem(int position) {
     55             return list.get(position);
     56         }
     57 
     58         @Override
     59         public long getItemId(int position) {
     60             return position;
     61         }
     62 
     63         @Override
     64         public View getView(int position, View convertView, ViewGroup parent) {
     65             if (convertView == null) {
     66                 convertView = View.inflate(getApplicationContext(),
     67                         R.layout.list_item, null);
     68                 holder = new ViewHolder();
     69                 holder.tv = (TextView) convertView.findViewById(R.id.tv);
     70                 holder.tv1 = (TextView) convertView.findViewById(R.id.tv1);
     71                 convertView.setTag(holder);
     72             } else {
     73                 holder = (ViewHolder) convertView.getTag();
     74             }
     75             holder.tv.setText(list.get(position));
     76             holder.tv1.setText("test----------" + position);
     77             return convertView;
     78         }
     79 
     80     }
     81 
     82     ViewHolder holder;
     83 
     84     class ViewHolder {
     85         TextView tv, tv1;
     86     }
     87 
     88     @Override
     89     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
     90         new MyTimer(10000, 1000, arg2).start();
     91     }
     92 
     93     class MyTimer extends CountDownTimer {
     94         int pos;
     95 
     96         public MyTimer(long millisInFuture, long countDownInterval, int pos) {
     97             super(millisInFuture, countDownInterval);
     98             this.pos = pos;
     99         }
    100 
    101         @Override
    102         public void onFinish() {
    103             int firstVisiblePosition = lv.getFirstVisiblePosition();
    104             int i = pos - firstVisiblePosition;
    105             if (i >= 0) {
    106                 View view = lv.getChildAt(i);
    107                 if (view != null) {
    108                     ViewHolder mHolder = (ViewHolder) view.getTag();
    109                     mHolder.tv.setText("end");
    110                 }
    111             }
    112             list.set(pos, "end");
    113 
    114         }
    115 
    116         @Override
    117         public void onTick(long millisUntilFinished) {
    118             int firstVisiblePosition = lv.getFirstVisiblePosition();
    119             int i = pos - firstVisiblePosition;
    120             if (i >= 0) {
    121                 View view = lv.getChildAt(i);
    122                 if (view != null) {
    123                     ViewHolder mHolder = (ViewHolder) view.getTag();
    124                     mHolder.tv.setText("ing" + millisUntilFinished / 1000);
    125                 }
    126             }
    127             list.set(pos, "ing" + millisUntilFinished / 1000);
    128         }
    129 
    130     }
    131 
    132 }

    (4)布署程序到模拟器,如下:

  • 相关阅读:
    iOS真机调试 for Xcode 5
    iOS/iphone开发如何为苹果开发者帐号APPID续费
    unity3d中布娃娃系统
    U3D实现与iOS交互
    两种方法连接MySql数据库
    Unity3D Gamecenter 得分上传失败的处理
    Unity3.5 GameCenter基础教程(转载)
    判断数字正则表达式
    (转)SQL server 2005查询数据库表的数量和表的数据量
    C#操作PowerDesigner代码
  • 原文地址:https://www.cnblogs.com/hebao0514/p/5266336.html
Copyright © 2011-2022 走看看