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();// 主角登场
}
});
}
/**
* 默认的数据是显示Tom和Jim
*/
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;
/* 重写构造方法,只传入Context和List<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.目前貌似只有ListView和GridView有这个方法。
联系方式:QQ 478586054(阿来Veer,若加请注明CSDN字样)