ListView定製不同的Item

一個listView中可能要顯示不同風格的item,下面就來介紹一下怎樣來實現。
先附上效果圖
這裏寫圖片描述

首先,自定義一個適配器
在adapter中必須實現這兩個方法

 /**
     * @param position 用於判斷加載哪種item 根據自己的需要來實現
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        if (position == 0) {//是否是第一項
            return 0;
        } else if (position == 1) {//是否是第二項
            return 1;
        } else {
            return 2;
        }
    }

    /**
     * @return Item的種類 這裏共三種,TYPE_COUNT==3;
     */
    @Override
    public int getViewTypeCount() {
        return TYPE_COUNT;
    }

然後在getView方法中調用getItemViewType(position)來判斷加載哪種佈局

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (getItemViewType(position) == 0) {/**加載第一種item**/
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = View.inflate(context, R.layout.list_item_one, null);
                viewHolder.firstText = (TextView) convertView.findViewById(R.id.tv_item_one);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.firstText.setText(arrayList.get(position).getFirstItem());
        } else if (getItemViewType(position) == 1) {/**加載第二種item**/
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = View.inflate(context, R.layout.list_item_two, null);
                viewHolder.secondTextTop = (TextView) convertView.findViewById(R.id.tv_item_two_top);
                viewHolder.secondTextBottom = (TextView) convertView.findViewById(R.id.tv_item_two_bottom);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.secondTextTop.setText(arrayList.get(position).getSecondItemTop());
            viewHolder.secondTextBottom.setText(arrayList.get(position).getSecondItemBottom());
        } else if (getItemViewType(position) == 2) {/**加載第三種item**/
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = View.inflate(context, R.layout.list_item_three, null);
                viewHolder.thirdText = (TextView) convertView.findViewById(R.id.tv_item_three);
                viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_item_three);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.thirdText.setText(arrayList.get(position).getThirdItemText());
            viewHolder.imageView.setImageResource(arrayList.get(position).getThirdItemImg());
        }
        return convertView;
    }

三種item的佈局文件比較簡單,這裏就不貼上來了。
接下來就是在activity中調用了

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.lv_main);
        initData();
        listView.setAdapter(new ListViewAdapter(this, arrayList));
    }

初始化數據:

 /**
     * 初始化數據
     * 根據自己的需要初始化數據,我這裏把所有的item放在一個javabean裏面,
     * 需要用哪個初始化哪個,我爲了簡單這樣寫的,但不建議這樣寫
     */
    private void initData() {
        arrayList = new ArrayList<>();
        arrayList.add(new ItemData("first item"));
        arrayList.add(new ItemData("second item top", "second item bottom"));
        arrayList.add(new ItemData("third item text1", R.mipmap.ic_launcher));
        arrayList.add(new ItemData("third item text2", R.mipmap.ic_launcher));
        arrayList.add(new ItemData("third item text3", R.mipmap.ic_launcher));
    }

好了,這樣就基本上完成了。

源碼下載

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