1. 程式人生 > >android元件ListView之BaseAdapter簡單使用

android元件ListView之BaseAdapter簡單使用

前面所說的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>

效果圖

這裡寫圖片描述