天天看点

notifyDataSetChanged() 动态更新ListView

有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView。今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.从今天起,每次学习的源代码都会打包上传,方便各位同学学习,注册帐号即可下载。

布局main.xml:

notifyDataSetChanged() 动态更新ListView
<?
   xml version="1.0" encoding="utf-8"
   ?>
   

   <
   LinearLayout 
   xmlns:android
   ="http://schemas.android.com/apk/res/android"
   
    android:orientation
   ="vertical"
   
    android:layout_width
   ="fill_parent"
   
    android:layout_height
   ="fill_parent"
   
    
   >
   

   <
   ListView  
   android:id
   ="@+id/lv"
   
    android:layout_width
   ="fill_parent"
    
    android:layout_height
   ="wrap_content"
    
    android:text
   ="@string/hello"
   
    
   />
   

   </
   LinearLayout
   >
        
notifyDataSetChanged() 动态更新ListView

ListView列表布局playlist.xml:

notifyDataSetChanged() 动态更新ListView
<?
   xml version="1.0" encoding="utf-8"
   ?>
   

   <
   TextView 
  
   android:id
   ="@+id/text1"
   
  xmlns:android
   ="http://schemas.android.com/apk/res/android"
   
  android:layout_width
   ="fill_parent"
   
  android:layout_height
   ="30px"
   
  android:textSize
   ="18sp"
   

   ></
   TextView
   >
        
notifyDataSetChanged() 动态更新ListView

程序代码:

notifyDataSetChanged() 动态更新ListView
1 
   import
    java.util.ArrayList;

    2 
    

    3 
    
   import
    android.app.Activity;

    4 
    
   import
    android.os.AsyncTask;

    5 
    
   import
    android.os.Bundle;

    6 
    
   import
    android.os.Handler;

    7 
    
   import
    android.view.View;

    8 
    
   import
    android.widget.AdapterView;

    9 
   
   import
    android.widget.ArrayAdapter;

   10 
   
   import
    android.widget.ListView;

   11 
   
   import
    android.widget.AdapterView.OnItemClickListener;

   12 
    

   13 
   
   public
    
   class
    main 
   extends
    Activity {

   14 
       
   /**
    Called when the activity is first created. 
   */
   

   15 
       ListView lv;

   16 
       ArrayAdapter
   <
   String
   >
    Adapter;

   17 
       ArrayList
   <
   String
   >
    arr
   =
   new
    ArrayList
   <
   String
   >
   ();

   18 
       @Override

   19 
       
   public
    
   void
    onCreate(Bundle savedInstanceState) {

   20 
           
   super
   .onCreate(savedInstanceState);

   21 
           setContentView(R.layout.main);

   22 
           lv
   =
   (ListView)findViewById(R.id.lv);

   23 
           arr.add(
   "
   123
   "
   );

   24 
           arr.add(
   "
   234
   "
   );

   25 
           arr.add(
   "
   345
   "
   );

   26 
           Adapter 
   =
    
   new
    ArrayAdapter
   <
   String
   >
   (
   this
   ,R.layout.playlist, arr);

   27 
           lv.setAdapter(Adapter);

   28 
           lv.setOnItemClickListener(lvLis); 

   29 
           editItem edit
   =
    
   new
    editItem();

   30 
           edit.execute(
   "
   0
   "
   ,
   "
   第1项
   "
   );
   //
   把第一项内容改为"第一项"
   

   31 
   
           Handler handler
   =
   new
    Handler();

   32 
           handler.postDelayed(add,
   3000
   );
   //
   延迟3秒执行
   

   33 
   
       }

   34 
       Runnable add
   =
   new
    Runnable(){

   35 
    

   36 
           @Override

   37 
           
   public
    
   void
    run() {

   38 
               
   //
    TODO Auto-generated method stub
   

   39 
   
               arr.add(
   "
   增加一项
   "
   );
   //
   增加一项
   

   40 
   
               Adapter.notifyDataSetChanged();    

   41 
           }       

   42 
       };

   43 
       
   class
    editItem 
   extends
    AsyncTask
   <
   String,Integer,String
   >
   {

   44 
           @Override

   45 
           
   protected
    String doInBackground(String... params) {

   46 
                   arr.set(Integer.parseInt(params[
   0
   ]),params[
   1
   ]);

   47 
                   
   //
   params得到的是一个数组,params[0]在这里是"0",params[1]是"第1项"

   48 
                   
   //
   Adapter.notifyDataSetChanged();

   49 
                   
   //
   执行添加后不能调用 Adapter.notifyDataSetChanged()更新UI,因为与UI不是同线程

   50 
                   
   //
   下面的onPostExecute方法会在doBackground执行后由UI线程调用
   

   51 
   
               
   return
    
   null
   ;    

   52 
           }

   53 
    

   54 
           @Override

   55 
           
   protected
    
   void
    onPostExecute(String result) {

   56 
               
   //
    TODO Auto-generated method stub
   

   57 
   
               
   super
   .onPostExecute(result);

   58 
               Adapter.notifyDataSetChanged();

   59 
               
   //
   执行完毕,更新UI
   

   60 
   
           }

   61 
    

   62 
       }

   63 
       
   private
    OnItemClickListener lvLis
   =
   new
    OnItemClickListener(){

   64 
           @Override

   65 
           
   public
    
   void
    onItemClick(AdapterView
   <?>
    arg0, View arg1, 
   int
    arg2,

   66 
                   
   long
    arg3) {

   67 
               
   //
   点击条目时触发

   68 
               
   //
   arg2即为点中项的位置
   

   69 
   
               setTitle(String.valueOf(arr.get(arg2)));

   70 
    

   71 
           }

   72 
    

   73 
       };

   74 
    

   75 
   }
 
        
notifyDataSetChanged() 动态更新ListView