1、
listView通常用SimpleAdapter、自定義BaseAdapter這兩種方法
2、
Android SimpleAdapter 的list刷新问题。
使用SimpleAdapter 创建的list,是不能通过
notifyDataSetChanged
来更新的,因为SimpleAdapter 主要是用来创建静态的数据的列表,如果要实现动态更新数据,需要自己定义一个基于BaseAdapter的adapter,然后通过notifyDataSetChanged
来更新list。
If you look at the SimpleAdapter description it says it is "An easy adapter to map static data to views defined in an XML file." I've added the emphasis -- put simply,
SimpleAdapater
isn't built for use with data that changes; it handles static data only. If you can't use an ArrayAdapter because your data has more than a single bit of text, then you will either have to build your own custom ListAdapter, or put your data in a DB and use one of the CursorAdapters.3、
也就是說如果要寫一個可能會刷新的ListView就要自定義介面。這個程式是我找到的例子。因為這篇還算是草稿,這邊只貼BaseAdapter的部份:檔案連結
import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.TextView; import java.util.ArrayList;import java.util.HashMap; public class lvButtonAdapter extends BaseAdapter { private class buttonViewHolder { ImageView appIcon; TextView appName; ImageButton buttonClose; } private ArrayListObject>> mAppList; private LayoutInflater mInflater; private Context mContext; private String[] keyString; private int[] valueViewID; private buttonViewHolder holder;,
public lvButtonAdapter(Context c, ArrayList
mAppList = appList; mContext = c; mInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); keyString = new String[from.length]; valueViewID = new int[to.length]; System.arraycopy(from, 0, keyString, 0, from.length); System.arraycopy(to, 0, valueViewID, 0, to.length); }
@Override public int getCount() {
return mAppList.size(); }
@Override public Object getItem(int position) {
return mAppList.get(position); }
@Override public long getItemId(int position) {
return position; }
public void removeItem(int position){
mAppList.remove(position); this.notifyDataSetChanged(); }
@Override public View getView(int position, View convertView, ViewGroup parent) {
if (convertView != null) {
holder = (buttonViewHolder) convertView.getTag(); } else {
convertView = mInflater.inflate(R.layout.lvitem, null); holder = new buttonViewHolder(); holder.appIcon = (ImageView)convertView.findViewById(valueViewID[0]); holder.appName = (TextView)convertView.findViewById(valueViewID[1]); holder.buttonClose = (ImageButton)convertView.findViewById(valueViewID[2]); convertView.setTag(holder); }
HashMap
String aname = (String) appInfo.get(keyString[1]); int mid = (Integer)appInfo.get(keyString[0]); int bid = (Integer)appInfo.get(keyString[2]); holder.appName.setText(aname); holder.appIcon.setImageDrawable(holder.appIcon.getResources().getDrawable(mid)); holder.buttonClose.setImageDrawable(holder.buttonClose.getResources().getDrawable(bid)); holder.buttonClose.setOnClickListener(new lvButtonListener(position)); }
return convertView; }
class lvButtonListener implements View.OnClickListener {
private int position;
lvButtonListener(int pos) {
position = pos; }
@Override public void onClick(View v) {
int vid=v.getId(); if (vid == holder.buttonClose.getId())
removeItem(position); }
}
}
參考網頁