Android UI 之 ListView

一、ListView的三要素
1、ListView本身
在主佈局中添加ListView控件,用來顯示列表
2、數據源
ListView要顯示的內容
3、適配器
將數據源匹配到指定行模板(一個佈局文件),並將每行集中“添加”到ListView中,是數據源與ListView結合起來的關鍵紐帶

二、ListView的兩種常用適配器
1、ArrayAdapter
ArrayAdapter適用於每行只簡單顯示字符串的ListView
ArrayAdapter的常用的構造方法有三個參數
一個是Context對象,一個行模板佈局文件以及數據源(數據源都是List類)
ListView通過setAdapter的方法設置指定的適配器對象
ListView通過setOnItemClickListener方法爲每一行設置監聽事件

    private void init(){
        view= (ListView) findViewById(R.id.root_list);
        data=getData();
        adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,data);
        view.setAdapter(adapter);
        view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                TextView textView= (TextView) view.findViewById(android.R.id.text1);
                Toast.makeText(ArrayAdapterActivity.this,
                        "點擊了"+textView.getText(),
                        Toast.LENGTH_SHORT).show();
            }
        });
    }

2、SimpleAdapter
僅僅只是簡單的文字列表有時是無法滿足用戶需求,如果需要每一行能顯示更多樣化的元素,不妨使用一下SimpleAdapter。
其實SimpleAdapter與ArrayAdapter很類似,唯一區別在與構造方法的使用上,以及數據源稍稍改變
SimpleAdapter的常用構造方法是帶5個參數的
分別是當前上下文對象,數據源,行模板佈局,剩下兩個是from,to就是從數據源一一映射到行模板上

adapter=new SimpleAdapter(
                getContext(),
                list,
                R.layout.simple_adapter_layout,
                new String[]{"image_s","title_s","info_s"},
                new int[]{R.id.image_s,R.id.title_s,R.id.info_s}
                );

數據源的獲取方法:List列表下的是一個Map鍵值對集合,因爲要映射的內容較多,當然也可以是類對象的列表

public List<Map<String,Object>> getData(){
        List<Map<String,Object>> dlist=new ArrayList<>();
        Map<String,Object> data=new HashMap<>();
        data.put("image_s",R.mipmap.icon_broswer_green);
        data.put("title_s","瀏覽");
        data.put("info_s","綠色的瀏覽圖標");
        dlist.add(data);

        data=new HashMap<>();
        data.put("image_s",R.mipmap.icon_debug_green);
        data.put("title_s","調試");
        data.put("info_s","綠色的調試圖標");
        dlist.add(data);

        data=new HashMap<>();
        data.put("image_s",R.mipmap.icon_refresh_green);
        data.put("title_s","刷新");
        data.put("info_s","綠色的刷新圖標");
        dlist.add(data);

        data=new HashMap<>();
        data.put("image_s",R.mipmap.icon_share_green);
        data.put("title_s","分享");
        data.put("info_s","綠色的分享圖標");
        dlist.add(data);

        return dlist;
    }

三、自定義ListView
雖然SimpleAdapter可以豐富的顯示每一行,但每一行的控件並無法響應監聽事件,例如按鈕點擊了沒有設定好的點擊效果,爲了滿足這一需求就必須自定義ListView,說白了就是自定義Adapter。
以下是我自定義Adapter,通過新建一個類然後繼承BaseAdapter,並實現四個方法
其中的關鍵方法是getView,在實現getView方法前先定義一個內部類ViewHolder在存放行模板的每一個部件(優化ListView,減少內存與時間的消耗),然後在getView中通過Inflater動態加載行模板佈局文件,綁定每一個部件後,並設置相應的值或狀態。最後在主Activity中通過setAdapter方法設置適配器爲自定義的Adapter即可

package com.example.yougel.listviewdemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;

public class CustomBtnAdapter extends BaseAdapter {
    private Context context;
    private List<User> users;
    private LayoutInflater inflater;

    public CustomBtnAdapter(Context context, List<User> users) {
        this.context = context;
        inflater=LayoutInflater.from(context);
        this.users = users;
    }

    private final class ViewHolder{
        private ImageView image_cb;
        private TextView username_cb;
        private TextView age_cb;
        private Button btn_cb;
    }

    @Override
    public int getCount() {
        return users.size();
    }

    @Override
    public Object getItem(int position) {
        return null!=users.get(position)?users.get(position):null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        final User user= (User) getItem(position);
        if(convertView==null){
            convertView=inflater.inflate(R.layout.custom_cb_layout,null);
            viewHolder=new ViewHolder();
            viewHolder.image_cb= (ImageView) convertView.findViewById(R.id.image_cb);
            viewHolder.username_cb= (TextView) convertView.findViewById(R.id.username_cb);
            viewHolder.age_cb= (TextView) convertView.findViewById(R.id.age_cb);
            viewHolder.btn_cb= (Button) convertView.findViewById(R.id.btn_cb);
            final ViewHolder finalViewHolder=viewHolder;
            viewHolder.btn_cb.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
//                    User btnUser= (User) finalViewHolder.btn_cb.getTag();
                    int num= (int) finalViewHolder.btn_cb.getTag();
                    Toast.makeText(context,"點擊了第"+(num+1)+"行",Toast.LENGTH_SHORT).show();
                }
            });
            convertView.setTag(viewHolder);
            viewHolder.btn_cb.setTag(position);
        }else {
            viewHolder= (ViewHolder) convertView.getTag();
            viewHolder.btn_cb.setTag(position);
        }
        String age=String.valueOf(user.getAge());
        viewHolder.image_cb.setBackgroundResource(user.getImgId());
        viewHolder.username_cb.setText(user.getUsername());
        viewHolder.age_cb.setText(age);
        return convertView;
    }
}

以上的編碼方式涉及到ListView的優化內容,優化的詳細請參考以下網址
http://blog.csdn.net/huanongjingchao/article/details/42918869

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章