• [转]notifyDataSetChanged() 动态更新ListView


    有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView。今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.
    布局main.xml:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:orientation="vertical"
     4     android:layout_width="fill_parent"
     5     android:layout_height="fill_parent"
     6     >
     7 <ListView  android:id="@+id/lv"
     8     android:layout_width="fill_parent" 
     9     android:layout_height="wrap_content" 
    10     android:text="@string/hello"
    11     />
    12 </LinearLayout>
    View Code

    ListView列表布局playlist.xml:

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <TextView 
    3   android:id="@+id/text1"
    4   xmlns:android="http://schemas.android.com/apk/res/android"
    5   android:layout_width="fill_parent"
    6   android:layout_height="30px"
    7   android:textSize="18sp"
    8 ></TextView>
    View Code

    程序代码:

     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 }
    View Code
  • 相关阅读:
    如何利用tinyxml操纵xml及注意问题
    C++使用tinyxml解析Xml内存泄漏问题
    介绍一下 linux命令 nohup 和 & 使得程序在后台运行
    RTP有效负载(载荷)类型 (RTP Payload Type)
    makefile 语法 /usr/bin/ld: cannot find -lxxxx
    C# + Matlab 实现计件工时基于三层BP神经网络的拟合--真实项目
    C#+Arduino Uno 实现声控系统完全实施手册
    DHT11温度传感器
    PbootCMS二次开发的查询
    腾讯云存储PHP上传实例【代码示例】
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/4731622.html
Copyright © 2020-2023  润新知