Android學習記錄之BaseAdapter及其SubClass基礎使用1

ArrayAdapter


1.從文檔中介紹來看ArrayAdapter原本就是用來幫助你顯示文本的,如果你想要顯示其它視圖比如:ImageView。就需要自己重寫getView()方法


2.如果是這樣,我覺得還不如使用SimpleAdapter或是BaseAdapter來得方便


3.構造方法中有四個參數

(1)context --- 包含有關應用環境的全局信息,允許我們訪問系統資源和服務,以及我們自己定義的特定資源

由於適配器需要了解每個列表項的佈局,因此需要引用我們自己定義的xml佈局

(2)id of list item layout --- 列表項的佈局

(3)id of text view --- 文本視圖的id

(4)list of data --- 數組列表(數據)


        List<String> array = new ArrayList<String>();
        for(int i=0; i<120; i++) {
            array.add("Tom");
        }
        final Context context = this;


        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, R.id.text, array){
            @Override
            public View getView(int position, View convertView, ViewGroup parent){
                if(convertView == null){
                    LayoutInflater inflater = LayoutInflater.from(context);
                    convertView = inflater.inflate(R.layout.listitem, null);
                }

                TextView textView = (TextView)convertView.findViewById(R.id.text);
                ImageView imageView = (ImageView)convertView.findViewById(R.id.image);

                textView.setText("Tom");
                imageView.setImageResource(R.mipmap.ic_launcher);

                return convertView;
            }
        };

        ListView listView = (ListView)findViewById(R.id.listView);
        listView.setAdapter(adapter);


SimpleAdapter



1.數據源類型List<? extends Map<String, ?>>


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);

        ListView listView = (ListView)findViewById(R.id.listView);
        SimpleAdapter simpleAdapter = new SimpleAdapter(this, getData(), R.layout.listitem,
                new String[]{"image", "text"}, new int[]{R.id.image, R.id.text});
        listView.setAdapter(simpleAdapter);
    }

    private List<Map<String, Object>> getData(){
        List<Map<String, Object>> list = new ArrayList<>();
        for(int i=0; i<120; i++) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("image", R.mipmap.ic_launcher);
            map.put("text", "Tom");
            list.add(map);
        }

        return list;
    }



BaseAdapter

1.該適配就比較靈活,因爲你可以重寫裏面的方法來實現自己的適配器

2.需要重寫的方法有:

     (1)public Object getItem(int position)

    (2)public int getCount()

    (3)public long getItemId(int position)

    (4)public View getView(int position, View convertView, ViewGroup)

         在這裏文檔裏建議應該檢查convertView是否爲空,若爲空就應該從新創建一個新的視圖,若不爲空,直接複用即可

3.你可以通過構造方法將必要的參數傳進來

public class TestBaseAdapter extends BaseAdapter {

    private List<String> list;
    private Context context;

    public TestBaseAdapter(List<String> list, Context context){
        this.list = list;
        this.context = context;
    }

    //在數據集中有多少個數據項
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    //返回指定位置數據項的id
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        //如果爲null就創建一個新的視圖
        if(convertView == null){
            LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.listitem, null);
            <span style="font-size:14px;"></span><pre name="code" class="java">            TextView textView = (TextView)convertView.findViewById(R.id.text);
            ImageView imageView = (ImageView)convertView.findViewById(R.id.image);

            textView.setText("Tom");
           imageView.setImageResource(R.mipmap.ic_launcher);
} return convertView; }
}


4.網上看見的一些人的整理

(1)第一種沒有任何處理BaseAdapter --- 因爲沒有複用機制,所以會浪費資源

(2)第二種使用了convertView進行復用 --- 就是我上面的寫的

(3)第三種就是通過一個靜態類保存視圖 ---  將視圖保存在緩存中,這樣就不用一直findViewById(),提高效率

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView textView = null;
        ImageView imageView = null;
        //如果爲null就創建一個新的視圖
        if(convertView == null){
            LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.listitem, null);
            textView = (TextView)convertView.findViewById(R.id.text);
            imageView = (ImageView)convertView.findViewById(R.id.image);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.text = textView;
            viewHolder.image = imageView;
            convertView.setTag(viewHolder);
        }else{
            ViewHolder viewHolder = (ViewHolder)convertView.getTag();
            textView = viewHolder.text;
            imageView = viewHolder.image;
        }

        textView.setText("Tom");
        imageView.setImageResource(R.mipmap.ic_launcher);

        return convertView;
    }

    private final class ViewHolder
    {
        public ImageView image;
        public TextView text;
    }

listview.xml



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </ListView>

</LinearLayout>

listitem.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


發佈了33 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章