现在的位置: 首页 > 综合 > 正文

Adapter.notifyDataSetChanged()方法测试

2013年02月10日 ⁄ 综合 ⁄ 共 5454字 ⁄ 字号 评论关闭

Adapter.notifyDataSetChanged()方法测试

时间:2012-5-4

原因:数据发生变化时,如何在界面及时更新。之前是用重启当前Activity的方法,虽然能解决问题,但是总感觉太不专业,后来在SW的指点下知道了适配器这个方法,于是记录下来。


Java代码:

1.AdapterDataTestActivity.java

package test.veer;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.Button;

import android.widget.ListView;

import android.widget.TextView;

/**

 * Adapter.notifyDataSetChanged()方法测试类

 * 

 * @author Veer

 * @advisor XY,SW

 * @version 1.0.0 2012-5-4

 */

public class AdapterDataTestActivity extends Activity {

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

    /** ListView组件 */

    private ListView listView;

    /** Button组件 */

    private Button button;

    /** 适配器 */

    private MyAdapter adapter;

    /** 待显示的数据 */

    private List<Map<String, Object>> dataList;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // 设置XML布局文件

        setContentView(R.layout.main_main);

        /* 获取布局文件中的组件 */

        listView = (ListView) findViewById(R.id.listView);

        button = (Button) findViewById(R.id.button);

        // 默认的显示数据,通过getData1()得到

        dataList = getData1();

        /* 初始化适配器,设置适配器 */

        adapter = new MyAdapter(AdapterDataTestActivity.this, dataList);

        listView.setAdapter(adapter);

        /* 设置按钮监听器 */

        button.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                dataList = getData2();// 待显示的数据发生变化,通过getData2()得到

                adapter.notifyDataSetChanged();// 主角登场

            }

        });

    }

    /**

     * 默认的数据是显示TomJim

     */

    private List<Map<String, Object>> getData1() {

        List<Map<String, Object>> dataList1 = new ArrayList<Map<String, Object>>();

        Map<String, Object> map;

        map = new HashMap<String, Object>();

        map.put("name", "Tom");

        dataList1.add(map);

        map = new HashMap<String, Object>();

        map.put("name", "Jim");

        dataList1.add(map);

        return dataList1;

    }

    /**

     * 改变之后的数据多了一个Lucy

     */

    private List<Map<String, Object>> getData2() {

        List<Map<String, Object>> dataList2 = new ArrayList<Map<String, Object>>();

        Map<String, Object> map;

        map = new HashMap<String, Object>();

        map.put("name", "Tom");

        dataList2.add(map);

        map = new HashMap<String, Object>();

        map.put("name", "Jim");

        dataList2.add(map);

        map = new HashMap<String, Object>();

        map.put("name", "Lucy");

        dataList2.add(map);

        return dataList2;

    }

    /** 自定义适配器,继承BaseAdapter */

    private class MyAdapter extends BaseAdapter {

        /** 布局填充器 */

        LayoutInflater myInflater;

        /** 自定义组件集合 */

        ViewHolder holder;

        /* 重写构造方法,只传入ContextList<Map<String, Object>>两个参数 */

        public MyAdapter(Context context, List<Map<String, Object>> list) {

            myInflater = LayoutInflater.from(context);

        }

        @Override

        public int getCount() {

            return dataList.size();

        }

        @Override

        public Object getItem(int position) {

            return dataList.get(position);

        }

        @Override

        public long getItemId(int position) {

            return position;

        }

        @Override

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

            if (convertView == null) {

                holder = new ViewHolder();

                // 填充另外一个XML布局文件

                convertView = myInflater.inflate(R.layout.main_item, null);

                // 获取相应的组件

                holder.nameView = (TextView) convertView

                        .findViewById(R.id.nameView);

                // 设置标记

                convertView.setTag(holder);

            } else {

                holder = (ViewHolder) convertView.getTag();

            }

            // 给组件赋值

            holder.nameView.setText(dataList.get(position).get("name")

                    .toString());

            return convertView;

        }

    }

    /**

     * 自定义组件集合类

     */

    private class ViewHolder {

        /** 显示的组件 */

        private TextView nameView;

    }

}

XML文件:

1.main_main.xml

<?xml version="1.0" encoding="utf-8"?>

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

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <Button 

        android:id="@+id/button"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="Change"

        />

    <ListView

        android:id="@+id/listView"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content" >

    </ListView>

</LinearLayout>

2.main_item.xml

<?xml version="1.0" encoding="utf-8"?>

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

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <TextView

        android:id="@+id/nameView"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        />

</LinearLayout>

点击Change按钮:

总结:

1.数据变量要声明为成员变量,重写自定义适配器类构造方法;

2.只能在UI主线程调用这个方法;

3.目前貌似只有ListViewGridView有这个方法。

联系方式:QQ 478586054(阿来Veer,若加请注明CSDN字样)

抱歉!评论已关闭.