android元件ListView之BaseAdapter簡單使用
阿新 • • 發佈:2019-01-02
前面所說的arrayAdapter和SimpleAdapter都是在BaseAdapter基礎之上為我們封裝好了功能,但是隻能在特定情況下使用,不夠靈活。今天我們動手寫一個自己的Adapter。繼承與BaseAdapter,實現四個抽象方法。分別是 getCount() 、getItem(int index)、 getItemId(int index)、 getView(int index, View view, ViewGroup arg2)。實現這個四個抽象類我們就能更加靈活的控制列表項裡的元件。
直接來看程式碼,在程式碼中加以註釋幫助理解。
繼承與Activity的入口介面類-MainActivity
public class MainActivity extends Activity {
private ListView listView;
private List<Map<String,Object>> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView)findViewById(R.id.listview);
initDataList();//初始化資料
MyAdapter adapter = new MyAdapter(this, dataList, R.layout.list_view);
listView.setAdapter(adapter);
}
/**
* 初始化介面卡需要的資料格式
*/
private void initDataList() {
//圖片資源
int img[] = { R.drawable.i1, R.drawable.i2, R.drawable.i3,
R.drawable.i4, R.drawable.i5, R.drawable.i6, R.drawable.i7,
R.drawable.i8, R.drawable.i9, R.drawable.i10 };
dataList = new ArrayList<Map<String, Object>>();
for (int i = 0; i < 10; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("img", img[i]);
map.put("title", "android" + i);
map.put("content", "SimpleAdapter" + i);
map.put("date",
new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
dataList.add(map);
}
}
}
自己的Adapter,繼承與BaseAdapter的MyAdapter
/**
* 自定義介面卡
*
* @author qiangzi
*
*/
public class MyAdapter extends BaseAdapter {
private List<Map<String, Object>> dataList;
private Context context;
private int resource;
/**
* 有參構造
*
* @param context
* 介面
* @param dataList
* 資料
* @param resource
* 列表項資原始檔
*/
public MyAdapter(Context context, List<Map<String, Object>> dataList,
int resource) {
this.context = context;
this.dataList = dataList;
this.resource = resource;
}
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int index) {
return dataList.get(index);
}
@Override
public long getItemId(int index) {
return index;
}
@Override
public View getView(int index, View view, ViewGroup arg2) {
// 宣告內部類
Util util = null;
// 中間變數
final int flag = index;
/**
* 根據listView工作原理,列表項的個數只建立螢幕第一次顯示的個數。
* 之後就不會再建立列表項xml檔案的物件,以及xml內部的元件,優化記憶體,效能效率
*/
if (view == null) {
util = new Util();
// 給xml佈局檔案建立java物件
LayoutInflater inflater = LayoutInflater.from(context);
view = inflater.inflate(resource, null);
// 指向佈局檔案內部元件
util.contentTextView = (TextView) view
.findViewById(R.id.item_content);
util.dateTextView = (TextView) view.findViewById(R.id.item_date);
util.titleTextView = (TextView) view.findViewById(R.id.item_title);
util.imageView = (ImageView) view.findViewById(R.id.item_img);
util.infoButton = (Button) view.findViewById(R.id.button_info);
util.deleteButton = (Button) view.findViewById(R.id.button_delete);
// 增加額外變數
view.setTag(util);
} else {
util = (Util) view.getTag();
}
// 獲取資料顯示在各元件
Map<String, Object> map = dataList.get(index);
util.contentTextView.setText((String) map.get("content"));
util.dateTextView.setText((String) map.get("date"));
util.titleTextView.setText((String) map.get("title"));
util.imageView.setImageResource((Integer) map.get("img"));
// 刪除按鈕,新增點選事件
util.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
dataList.remove(flag);
notifyDataSetChanged();
Map<String, Object> map = dataList.get(flag);
String str = "已刪除\n標題:" + map.get("title") + "\n內容:"
+ map.get("content") + "\n日期:" + map.get("date");
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
});
// 詳情按鈕,新增點選事件
util.infoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Map<String, Object> map = dataList.get(flag);
String str = "標題:" + map.get("title") + "\n內容:"
+ map.get("content") + "\n日期:" + map.get("date");
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
});
return view;
}
}
/**
* 內部類,用於輔助適配
*
* @author qiangzi
*
*/
class Util {
ImageView imageView;
TextView contentTextView, dateTextView, titleTextView;
Button infoButton, deleteButton;
}
佈局檔案ListView主檔案activity_main.xml
<RelativeLayout 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"
tools:context="com.example.baseadapter.MainActivity" >
<ListView
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
列表項佈局檔案list_view.xml
<RelativeLayout 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" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/item_img"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:orientation="vertical" >
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="標題"
android:textColor="#F00"
android:textSize="20sp" />
<TextView
android:id="@+id/item_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="內容"
android:textColor="#000"
android:textSize="16sp" />
<TextView
android:id="@+id/item_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="時間"
android:textSize="10sp" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal" >
<Button
android:id="@+id/button_info"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_alignParentRight="true"
android:text="詳情"
android:textSize="10sp" />
<Button
android:id="@+id/button_delete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_alignParentRight="true"
android:text="刪除"
android:textSize="10sp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>