【Android】BaseAdapter探索

ps:代碼都是簡潔形式的,比如

public class MainActivity extends Activity {

}

我就是直接寫成

Activity {

}

如有問題請多包涵。

一般我們做ListView的核心就是做適配器adapter,而適配器裏存放的無非就是資源和樣式
直接在Activity{}裏寫一個自定義的類MyAdapter ,然後繼承BaseAdapter,這時候會報錯,按alt+回車,OK添加一些方法,即可出現以下一堆東西

Activity {
    private class MyAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return 0;
        }
        @Override
        public Object getItem(int i) {
            return null;
        }
        @Override
        public long getItemId(int i) {
            return 0;
        }
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            return null;
        }
    }
}

然後在適配器裏寫構造函數,當new MyAdapter() 的時候,需要傳入當前的上下文,後續用於加載子項佈局,按Ctrl鍵+F鍵觀察mInflater的操作

MyAdapter {
        private LayoutInflater mInflater = null;
        private MyAdapter (Context context)
        {
            //根據context上下文加載佈局,這裏的是Activity本身,即this
            this.mInflater = LayoutInflater.from(context);
        }
}

然後其他幾個函數就這麼寫

MyAdapter {
        @Override
        public int getCount() {
            return data.size();
        }
        @Override
        public Object getItem(int position) {
            return getItem(position);
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
}

最複雜的getView後面介紹,前面講一講做getView需要哪些準備步驟,首先需要有一個數據集合,比如下文的data,這個是自己做的數據集合,使用了List< Map< String, Object>>,一種看起來非常複雜,但是一旦用過愛不釋手的數據存儲方式,將每種類型的值存入數組,然後將數組按照key循環存入map,說的比較複雜,直接看代碼,然後在草稿紙上畫一畫可能清楚一點

Activity {
    private int[] images;
    private String[] names;
    private String[] status;
    private String[] colors;
    private List<Map<String, Object>> data;

    private void initData(){

        images =new int[]{
                R.drawable.clothes_normal_img,
                R.drawable.clothes_normal_img,
                R.drawable.clothes_off_img,
                R.drawable.clothes_off_img};

        names=new String[]{"衣服5671","衣服2235","衣服3059","衣服9074"};

        status=new String[]{
                "連接狀態:連接  狀態:開  使用時長",
                "連接狀態:連接  狀態:開  使用時長",
                "連接狀態:未連接  狀態:關  使用時長",
                "連接狀態:未連接  狀態:關  使用時長"};

        colors=new String[]{"#70b789","#70b789","#888888","#888888"};

        data = new ArrayList<Map<String, Object>>();

        Map<String, Object> map;

        for(int i = 0; i< images.length; i++)
        {
            map = new HashMap<String, Object>();
            map.put("img", images[i]);
            map.put("name", names[i]);
            map.put("status", status[i]);
            map.put("color",colors[i]);
            data.add(map);
        }
    }
}

就是將圖片,名稱,狀態,顏色這些一股腦放入map中,然後將map放入data中,List集合就相當於一個從0開始自增長的泛類型數組,map則是鍵值對,< String, Object>可以存各種類型的值,非常強大!

定義一個類用來存放需要修改的資源類型,比如我需要修改的有一個圖片和兩個文字


Activity{

    static class ViewHolder
    {
        public ImageView img;
        public TextView title;
        public TextView info;
    }

}//Activity

適配器的一個重點就是getView,它在每個子項顯示的時候調用,我們剛剛定義的ViewHolder類裏面有我們需要的所有類型,所以在getView中定義一個該類對象,並讓它去匹配佈局中的控件,Ctrl鍵+F鍵關注convertView的去向


Activity{

    MyAdapter{

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            //如果緩存convertView爲空,則需要創建View
            if(convertView == null)
            {
                holder = new ViewHolder();
                //根據自定義的Item佈局加載佈局
                convertView = mInflater.inflate(R.layout.listview_item_layout, null);
                holder.img = (ImageView)convertView.findViewById(R.id.clothes_img);
                holder.title = (TextView)convertView.findViewById(R.id.item_title);
                holder.info = (TextView)convertView.findViewById(R.id.item_info);

                //將設置好的佈局保存到緩存中,並將其設置在Tag裏,以便後面方便取出Tag
                convertView.setTag(holder);
            }else
            {
                holder = (ViewHolder)convertView.getTag();
            }    
        }//getView

    }//MyAdapter

}//Activity

上面有一個listview_item_layout是自定義的子項佈局,通過inflate加載這個佈局,然後後面的那些控件對象才能找到相應的控件,其實這一步就相當於定義了adapter的樣式
其實很多時候麻煩的不是寫代碼,而是調佈局細節,雖然我這沒什麼東西,但是還是調了很久
爲了簡潔,就不把每個屬性都寫出來了,需要的時候慢慢調,百度怎麼居中,左右距離之類的

<LinearLayout
    android:id="@+id/li2ll">
    <LinearLayout
        >
        <ImageView
            android:src="@drawable/clothes_normal_img"
            android:id="@+id/clothes_img"/>
    </LinearLayout>

    <LinearLayout
        >
        <TextView
            android:id="@+id/item_title"/>
        <LinearLayout
            >
            <TextView
                android:id="@+id/item_info"
                android:text="連接狀態:連接  狀態:開  使用時長"/>
            <ImageView
                android:src="@drawable/edit_device_img"/>
        </LinearLayout>

    </LinearLayout>

</LinearLayout>

出來效果就這樣
item
上面的圖片也是美工提供的,還有版式,其實我一直覺得美工纔是最牛逼的,或者說圖形設計,要是讓我自己來想樣式根本想不到

getView的最後一步就是給每個控件對象設置資源,注意剛剛我們定義了data,我說做adapter無非就是樣式和資源,樣式已經通過上面定好了,這次把資源都放進去


Activity{

    MyAdapter{

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

            //因爲position已經把位置選好,取時直接到data中取即可,第二個get就是取map中的值
            holder.img.setImageResource((Integer) data.get(position).get("img"));
            holder.title.setText((String)data.get(position).get("name"));
            holder.info.setText((String)data.get(position).get("status"));
            holder.info.setTextColor(Color.parseColor ((String)data.get(position).get("color")));

            return convertView;

        }//getView

    }//MyAdapter

}//Activity

getView相當於單片機中的底層中斷函數,只不過是中斷條件爲,【某個item顯示在屏幕中】
此時getView被執行,立刻進去尋找相關的控件,組織樣式,放入資源,然後返回給調用它的函數,顯示出來。

好了經過上面一系列操作適配器做好了以後,就把他放到listview裏面去


Activity{

    private ListView mListView;
    private MyAdapter adapter;

    onCreate() {
        mListView =findViewById(R.id.list_view);
        adapter=new MyAdapter(this);
        mListView.setAdapter(adapter);
    }

}

至於list_view也是非常簡單,就一個列表一行字

<LinearLayout
    >
    <TextView
        android:text="設備列表"/>
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#d8d8d8"/>
    <ListView
        android:id="@+id/list_view"
        >
    </ListView>
</LinearLayout>

同樣只列一些簡單的屬性方便查看
運行即可顯示
666

其實listview對我來說是比較難的,這次探索也是費了很多勁,記下來希望下次用的時候能快速回憶起來。

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