精华内容
下载资源
问答
  • 主要介绍了Android编程实现动态更新ListView的方法,结合实例形式详细分析了ListView的布局及动态更新实现方法,需要的朋友可以参考下
  • 本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法。分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器...
  • 在Android中通常都会用到listview.那么flutter里面怎么用呢. 在flutter官网文档可以看见对listview介绍: 在Android ListView中,您可以创建一个适配器,然后您可以将它传递给ListView,该适配器将使用适配器返回的...

     

    在Android中通常都会用到listview.那么flutter里面怎么用呢.

    在flutter官网文档可以看见对listview介绍:

    在Android ListView中,您可以创建一个适配器,然后您可以将它传递给ListView,该适配器将使用适配器返回的内容来展示每一行。 然而,你必须确保在合适的时机回收行,否则,你会得到各种疯狂的视觉和内存问题。

    在Flutter中,由于Flutter的不可变的widget模型,将一个Widgets列表传递给的ListView,而Flutter将负责确保它们快速平滑地滚动。

    你可以直接new listview():

     @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text("Sample App"),
          ),
          body: new ListView(children: _getListData()),
        );
      }
    
      _getListData() {
        List<Widget> widgets = [];
        for (int i = 0; i < 100; i++) {
          widgets.add(new Padding(padding: new EdgeInsets.all(10.0), child: new Text("Hello, world.")));
        }
        return widgets;
      }

    或者通过listview.Builder():当你拥有大量数据李列表时,它会自动为您回收列表元素.

     body: ListView.builder(
                itemCount: list == null ? 0 : list.length,
                itemBuilder: (BuildContext context, int position) {
                  return _getListDate(context, position);
                }),
          ),
    itemCount表示长度相当于AndroidAdapter的getCount().
    itemBuilder()里面返回当前position下的视图.
    _getListDate返回视图.相当于Android adapter的getview().
      Widget _getListDate(BuildContext context, int position) {
        if (list != null) {
            return GestureDetector(
              onTap: () {
                showMessage(list[position]);
              },
              child: Center(
                  child: new Container(
                      width: getScreenWidth(context),
                      decoration: BoxDecoration(
                        color: Colors.white,
                      ),
                      margin: EdgeInsets.only(top: 2.0),
                      padding: EdgeInsets.only(top: 10.0, bottom: 10.0),
                      child: Center(child: new Text(list[position])))),
            );
        }
      }

    如果从接口拿数据一开始我们的itemCount很定是0,那么要去请求接口拿数据刷新UI了.

    网络请求我用的是flutter的HttpClient();这里需要导包 import 'dart:io';

     _getdata() async {
        if (list != null) {
          return;
        }
       // 创建一个HTTP client
        var httpClient = new HttpClient();
        //创建一个url Uri.http();这里指定的是http请求,也可以https.可以看见第一个参数给的时候没有加上http://,加了会报错.第三个参数带上了请求Parameter.
        var url = new Uri.http('api.xxx.xxx', '/config/profession',
            {'accessToken': 'xxxxxxxxxxxx'});
        var requset = await httpClient.getUrl(url);
        var close = await requset.close();
        var boby = await close.transform(UTF8.decoder).join();
        //JSON解析拿到数据.
        Map mapJson = JSON.decode(boby);
        //拿到listview列表的数据.
        list = mapJson['data'];
        print(JSON.decode(boby));
        //更新视图.
        setState(() {});
      }

    到这里一个简单的通过网络请求动态更新listview基本实现了.

    展开全文
  • Android操作数据的动态更新ListView

    千次阅读 2016-07-14 23:18:36
    Android操作数据的动态更新ListView你能猜想这是我四个按钮操作之后的效果图吗布局文件:activity_main.xml xmlns:tools="http://schemas.android.com/tools" android

    Android操作数据的动态更新ListView

    你能猜想这是我四个按钮操作之后的效果图吗

    这里写图片描述

    布局文件:activity_main.xml

    <LinearLayout 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:orientation="vertical"
        tools:context=".MainActivity">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <Button
                android:id="@+id/btn_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="添加一条记录" />
    
            <Button
                android:id="@+id/btn_add2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="往第五列插入一条数据" />
    
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <Button
                android:id="@+id/btn_remove"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="根据对象删除数据" />
    
            <Button
                android:id="@+id/btn_remove2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="根据游标删除数据" />
    
    
        </LinearLayout>
    
    
        <ListView
            android:id="@+id/list_one"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/txt_empty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textColor="#000000"
            android:textSize="15pt" />
    
    </LinearLayout>
    

    展示视图控制文件:MainActivity

    package run.yang.com.listviewactivedemo;
    
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
    
    import java.util.LinkedList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
        private ListView list_one;
        private TextView txt_empty;
        private Button btn_add;
        private Button btn_add2;
        private Button btn_remove;
        private Button btn_remove2;
        private MyAdapter mAdapter = null;
        private List<Data> mData = null;
        private Context mContext = null;
        private int flag = 1;
        private Data mData_5 = null;   //用来临时放对象的
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = MainActivity.this;
            mData = new LinkedList<Data>();
            mAdapter = new MyAdapter((LinkedList<Data>) mData,mContext);
            bindViews();
    
        }
    
        private void bindViews(){
    
            list_one = (ListView) findViewById(R.id.list_one);
            txt_empty = (TextView) findViewById(R.id.txt_empty);
            btn_add = (Button) findViewById(R.id.btn_add);
            btn_add2 = (Button) findViewById(R.id.btn_add2);
            btn_remove = (Button) findViewById(R.id.btn_remove);
            btn_remove2 = (Button) findViewById(R.id.btn_remove2);
    
            txt_empty.setText("暂无数据~");
            list_one.setAdapter(mAdapter);
            list_one.setEmptyView(txt_empty);
            btn_add.setOnClickListener(this);
            btn_add2.setOnClickListener(this);
            btn_remove.setOnClickListener(this);
            btn_remove2.setOnClickListener(this);
        }
    
    
        private void updateListItem(int postion,Data mData){
            int visiblePosition = list_one.getFirstVisiblePosition();
            View v = list_one.getChildAt(postion - visiblePosition);
            ImageView img = (ImageView) v.findViewById(R.id.img_icon);
            TextView tv = (TextView) v.findViewById(R.id.txt_content);
            img.setImageResource(mData.getImgId());
            tv.setText(mData.getContent());
        }
    
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_add:
                    if(flag == 5){
                        mData_5 = new Data(R.mipmap.ic_icon_qitao,"给政哥跪了~~~ x " + flag);
                        mAdapter.add(mData_5);
                    }else{
                        mAdapter.add(new Data(R.mipmap.ic_icon_qitao,"给政哥跪了~~~ x " + flag));
                    }
                    flag++;
                    break;
                case R.id.btn_add2:
                    //position从0开始算的
                    mAdapter.add(4,new Data(R.mipmap.ic_icon_qitao,"给政哥跪了~~~ x " + flag));
                    break;
                case R.id.btn_remove:
                    mAdapter.remove(mData_5);
                    break;
                case R.id.btn_remove2:
                    mAdapter.remove(2);
                    break;
            }
        }
    }
    
    

    写个Data.java,大家不陌生吧

    package run.yang.com.listviewactivedemo;
    
    /**
     * Created by yang_zzheng on 2016/7/14
     * yangzhizheng2012@163.com
     */
    public class Data {
        private int imgId;
        private String content;
    
        public Data() {}
    
        public Data(int imgId, String content) {
            this.imgId = imgId;
            this.content = content;
        }
    
        public int getImgId() {
            return imgId;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setImgId(int imgId) {
            this.imgId = imgId;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }
    
    
    

    自定义的BaseAdapter—->MyAdapter.java

    package run.yang.com.listviewactivedemo;
    
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
    
    import java.util.LinkedList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
        private ListView list_one;
        private TextView txt_empty;
        private Button btn_add;
        private Button btn_add2;
        private Button btn_remove;
        private Button btn_remove2;
        private MyAdapter mAdapter = null;
        private List<Data> mData = null;
        private Context mContext = null;
        private int flag = 1;
        private Data mData_5 = null;   //用来临时放对象的
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = MainActivity.this;
            mData = new LinkedList<Data>();
            mAdapter = new MyAdapter((LinkedList<Data>) mData,mContext);
            bindViews();
    
        }
    
        private void bindViews(){
    
            list_one = (ListView) findViewById(R.id.list_one);
            txt_empty = (TextView) findViewById(R.id.txt_empty);
            btn_add = (Button) findViewById(R.id.btn_add);
            btn_add2 = (Button) findViewById(R.id.btn_add2);
            btn_remove = (Button) findViewById(R.id.btn_remove);
            btn_remove2 = (Button) findViewById(R.id.btn_remove2);
    
            txt_empty.setText("暂无数据~");
            list_one.setAdapter(mAdapter);
            list_one.setEmptyView(txt_empty);
            btn_add.setOnClickListener(this);
            btn_add2.setOnClickListener(this);
            btn_remove.setOnClickListener(this);
            btn_remove2.setOnClickListener(this);
        }
    
    
        private void updateListItem(int postion,Data mData){
            int visiblePosition = list_one.getFirstVisiblePosition();
            View v = list_one.getChildAt(postion - visiblePosition);
            ImageView img = (ImageView) v.findViewById(R.id.img_icon);
            TextView tv = (TextView) v.findViewById(R.id.txt_content);
            img.setImageResource(mData.getImgId());
            tv.setText(mData.getContent());
        }
    
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_add:
                    if(flag == 5){
                        mData_5 = new Data(R.mipmap.ic_icon_qitao,"给政哥跪了~~~ x " + flag);
                        mAdapter.add(mData_5);
                    }else{
                        mAdapter.add(new Data(R.mipmap.ic_icon_qitao,"给政哥跪了~~~ x " + flag));
                    }
                    flag++;
                    break;
                case R.id.btn_add2:
                    //position从0开始算的
                    mAdapter.add(4,new Data(R.mipmap.ic_icon_qitao,"给政哥跪了~~~ x " + flag));
                    break;
                case R.id.btn_remove:
                    mAdapter.remove(mData_5);
                    break;
                case R.id.btn_remove2:
                    mAdapter.remove(2);
                    break;
            }
        }
    }
    
    

    当然少不了我们的列表项目布局item_list.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
    
        <ImageView
            android:id="@+id/img_icon"
            android:layout_width="56dp"
            android:layout_height="56dp"/>
    
        <TextView
            android:id="@+id/txt_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginLeft="10dp"
            android:textSize="18sp" />
    
    </LinearLayout>

    哈哈适配器也就需要这几个文件

    本文参考文件:

    http://blog.csdn.net/coder_pig/article/details/48631595

    展开全文
  • 首先,您需要创建一个包含EditText和ListView的XML布局。xmlns:android=...

    首先,您需要创建一个包含EditText和ListView的XML布局。

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:hint="type to filter"

    android:inputType="text"

    android:maxLines="1"/>

    android:layout_width="fill_parent"

    android:layout_height="0dip"

    android:layout_weight="1"

    />

    这将使一切正常,在ListView上方有一个很好的EditText。接下来,像往常一样创建ListActivity,但在onCreate()方法中添加setContentView()调用,以便我们使用最近声明的布局。请记住,我们特别使用android:id="@android:id/list"来识别ListView。这允许ListActivity知道我们想要在我们声明的布局中使用哪个ListView。

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.filterable_listview);

    setListAdapter(new ArrayAdapter(this,

    android.R.layout.simple_list_item_1,

    getStringArrayList());

    }现在运行应用程序应该显示您之前的ListView,上面有一个很好的框。为了使该框执行某些操作,我们需要从中获取输入,并使该输入过滤列表。虽然很多人尝试手动执行此操作,但大多数ListView Adapter类附带了一个Filter对象,可用于自动执行过滤。我们只需要将EditText的输入传输到Filter。事实证明这很容易。要运行快速测试,请将此行添加到您的onCreate()电话中

    adapter.getFilter().filter(s);请注意,您需要将ListAdapter保存到变量才能使其正常工作 - 我已将之前的ArrayAdapter保存到名为“adapter”的变量中。

    下一步是从EditText获取输入。这实际上需要一些思考。您可以将OnKeyListener()添加到您的EditText。但是,此侦听器仅接收一些关键事件。例如,如果用户输入“wyw”,预测文本可能会推荐“眼睛”。在用户选择“wyw”或“eye”之前,您的OnKeyListener将不会收到关键事件。有些人可能更喜欢这种解决方案,但我发现它令人沮丧。我想要每个关键事件,所以我可以选择过滤或不过滤。解决方案是TextWatcher。只需创建并将TextWatcher添加到EditText,并在每次文本更改时将ListAdapter Filter传递给过滤器请求。请记得删除OnDestroy()中的TextWatcher!这是最终的解决方案:

    private EditText filterText = null;

    ArrayAdapter adapter = null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.filterable_listview);

    filterText = (EditText) findViewById(R.id.search_box);

    filterText.addTextChangedListener(filterTextWatcher);

    setListAdapter(new ArrayAdapter(this,

    android.R.layout.simple_list_item_1,

    getStringArrayList());

    }

    private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {

    }

    public void beforeTextChanged(CharSequence s, int start, int count,

    int after) {

    }

    public void onTextChanged(CharSequence s, int start, int before,

    int count) {

    adapter.getFilter().filter(s);

    }

    };

    @Override

    protected void onDestroy() {

    super.onDestroy();

    filterText.removeTextChangedListener(filterTextWatcher);

    }

    展开全文
  • flutter动态更新ListView

    千次阅读 2020-08-24 22:39:04
    需要更新适配器并调用notifyDataSetChanged。在Flutter中,如果setState()中更新widget列表,您会...要更新ListView,然后在setState中创建一个新的List()并将所有旧数据复制到新列表中。这是实现更新的简单方法。

    需要更新适配器并调用notifyDataSetChanged。在Flutter中,如果setState()中更新widget列表,您会发现没有变化, 这是因为当setState被调用时,Flutter渲染引擎会遍历所有的widget以查看它们是否已经改变。 当遍历到你的ListView时,它会做一个==运算,以查看两个ListView是否相同,因为没有任何改变,因此没有更新数据。

    1.要更新ListView,然后在setState中创建一个新的List并将所有旧数据复制到新列表中。

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(new SampleApp());
    }
    
    class SampleApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Sample App',
          theme: new ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: new SampleAppPage(),
        );
      }
    }
    
    class SampleAppPage extends StatefulWidget {
      SampleAppPage({Key key}) : super(key: key);
    
      @override
      _SampleAppPageState createState() => new _SampleAppPageState();
    }
    
    class _SampleAppPageState extends State<SampleAppPage> {
      List widgets = [];
    
      @override
      void initState() {
        super.initState();
        for (int i = 0; i < 100; i++) {
          widgets.add(getRow(i));
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text("Sample App"),
          ),
          body: new ListView(children: widgets),
        );
      }
    
      Widget getRow(int i) {
        return new GestureDetector(
          child: new Padding(
              padding: new EdgeInsets.all(10.0),
              child: new Text("Row $i")),
          onTap: () {
            setState(() {
              widgets = new List.from(widgets);
              widgets.add(getRow(widgets.length + 1));
              print('row $i');
            });
          },
        );
      }
    }
    

    2.推荐的更新列表方法:使用ListView.Builder。当拥有动态列表或包含大量数据的列表时,此方法非常有用。 这实际上相当于在Android上使用RecyclerView,它会自动为您回收列表元素

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(new SampleApp());
    }
    
    class SampleApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Sample App',
          theme: new ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: new SampleAppPage(),
        );
      }
    }
    
    class SampleAppPage extends StatefulWidget {
      SampleAppPage({Key key}) : super(key: key);
    
      @override
      _SampleAppPageState createState() => new _SampleAppPageState();
    }
    
    class _SampleAppPageState extends State<SampleAppPage> {
      List widgets = [];
    
      @override
      void initState() {
        super.initState();
        for (int i = 0; i < 100; i++) {
          widgets.add(getRow(i));
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
            appBar: new AppBar(
              title: new Text("Sample App"),
            ),
            body: new ListView.builder(
                itemCount: widgets.length,
                itemBuilder: (BuildContext context, int position) {
                  return getRow(position);
                }));
      }
    
      Widget getRow(int i) {
        return new GestureDetector(
          child: new Padding(
              padding: new EdgeInsets.all(10.0),
              child: new Text("Row $i")),
          onTap: () {
            setState(() {
              widgets.add(getRow(widgets.length + 1));
              print('row $i');
            });
          },
        );
      }
    }
    

    这不是创建一个“新的ListView”,而是创建一个新的ListView.builder,它接受两个参数,即列表的初始长度和一个ItemBuilder函数。
    ItemBuilder函数非常类似于Android适配器中的getView函数,它需要一个位置并返回要为该位置渲染的行。onTap函数里不会再重新创建列表,而只是添加新元素到列表。

    展开全文
  • Android动态更新ListView

    2021-05-26 17:51:52
    实现效果:当滑动ListView列表最底端时,动态的添加新的列表项实现步骤:调用ListView的setOnScrollListener()方法设置滑动监听器,实现OnScrollListener接口的方法判断当列表滑动到最低端时,加载新的列表项接口...
  • 根据EditText搜索框ListView动态显示数据是根据需求来的...4、利用notifyDataSetChanged()动态更新ListView 第一步:创建一个搜索框 这个还是比较容易的,这里我使用的是http://blog.csdn.net/walker02/article/detail
  • 动态更新 ListView

    2012-08-03 17:40:15
    http://www.cnblogs.com/wangjianhui/archive/2011/06/15/2081705.html
  • notifyDataSetChanged() 动态更新ListView

    万次阅读 2018-07-22 00:13:11
    有时候我们需要修改已经生成的列表,添加或者...今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView。   &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt...
  • 有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView。今
  • 如果事先已经创建了List,我可以填充ListView,但是如何使用动态获取的数据填充它?主要活动public class MainActivity extends Activity {private ListView myListView;private Context ctx;@Overridepublic void ...
  • 主要介绍了Android实现Listview异步加载网络图片并动态更新的方法,结合实例形式详细分析了ListView异步加载数据的操作步骤与具体实现技巧,需要的朋友可以参考下
  • notifyDataSetChanged 更新数组越界...动态更新数据 只能通过修改原有对象的方式,不能重新赋值,否则无法触发adapter的视图更新。 lineListViewAdapter = new LineListViewAdapter(LineListActivity.this, this.lin...
  • 在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中。实现步骤:调用ListView的setOnScrollListener()方法设置滑动监听器,实现...
  • 在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中。 实现步骤:调用ListView的setOnScrollListener()方法设置滑动监听器,实现...
  • 动态更新listview adapter

    千次阅读 2012-09-20 16:42:51
    比如listview有三个项,那我有没有机会,能动态改变的成4项呢? 我说,有机会。  那我们需要简单理解list adapter的关系,adapter是MVC中的M,用来管理数据,那应该我们有机会来添加 删除 插入等操作。  ...
  • mListView = (ListView) findViewById(R.id.listView1); LayoutInflater inflater = getLayoutInflater(); View v = inflater.inflate(R.layout.list_footer, null); final TextView mTextView =(TextView) v....
  • 前面所有ListView里面要填充的数据都是静态的,但在实际开发中,这些数据往往都是动态变化的,就涉及到ListView数据的更新问题了。
  • 当点击删除按钮时,该列表项被删除,并且更新后的列表实时显示。 ... ListView deleteLv; String[] hotCitys = {"北京","上海","广州","深圳","珠海","佛山","南京","苏州","厦门","长沙","成都",
  • 动态更新ListView

    千次阅读 2013-04-03 00:15:59
    实现效果:当滑动ListView列表最底端时,动态的添加新的列表项 实现步骤:调用ListView的setOnScrollListener()方法设置滑动监听器,实现OnScrollListener接口的方法判断当列表滑动到最低端时,加载新的列表项 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,200
精华内容 7,280
关键字:

动态更新listview