Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android技術基礎 >> 2.5.1 ListView Item多布局的實現

2.5.1 ListView Item多布局的實現

編輯:Android技術基礎

本節引言:

本節是ListView這個小節的最後一節,給大家帶來的是ListView多布局Item的實現, 何為ListView Item多布局,打個比方,QQ這種聊天列表:

假如他是用一個ListView做的,那麼一個ListView上不就有兩種不同的Item咯! 一左一右,嘿嘿,本節就來教大家如何實現ListView的多布局!


1.要點講解:

重寫getItemViewType()方法對應View是哪個類別,以及getViewTypeCount()方法iew返回 總共多少個類別!然後再getView那裡調用getItemViewType獲得對應類別,再加載對應的View!


2.代碼實現:

這裡的話直接用上一節的兩個布局,然後另外寫一個Adapter重寫要點中的幾個幾個地方:


MutiLayoutAdapter.java

/**
 * Created by Jay on 2015/9/23 0023.
 */
public class MutiLayoutAdapter extends BaseAdapter{

    //定義兩個類別標志
    private static final int TYPE_BOOK = 0;
    private static final int TYPE_APP = 1;
    private Context mContext;
    private ArrayList<Object> mData = null;


    public MutiLayoutAdapter(Context mContext,ArrayList<Object> mData) {
        this.mContext = mContext;
        this.mData = mData;
    }

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

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

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

    //多布局的核心,通過這個判斷類別
    @Override
    public int getItemViewType(int position) {
        if (mData.get(position) instanceof App) {
            return TYPE_APP;
        } else if (mData.get(position) instanceof Book) {
            return TYPE_BOOK;
        } else {
            return super.getItemViewType(position);
        }
    }

    //類別數目
    @Override
    public int getViewTypeCount() {
        return 2;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int type = getItemViewType(position);
        ViewHolder1 holder1 = null;
        ViewHolder2 holder2 = null;
        if(convertView == null){
           switch (type){
               case TYPE_APP:
                   holder1 = new ViewHolder1();
                   convertView = LayoutInflater.from(mContext).inflate(R.layout.item_one, parent, false);
                   holder1.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
                   holder1.txt_aname = (TextView) convertView.findViewById(R.id.txt_aname);
                   convertView.setTag(R.id.Tag_APP,holder1);
                   break;
               case TYPE_BOOK:
                   holder2 = new ViewHolder2();
                   convertView = LayoutInflater.from(mContext).inflate(R.layout.item_two, parent, false);
                   holder2.txt_bname = (TextView) convertView.findViewById(R.id.txt_bname);
                   holder2.txt_bauthor = (TextView) convertView.findViewById(R.id.txt_bauthor);
                   convertView.setTag(R.id.Tag_Book,holder2);
                   break;
           }
        }else{
            switch (type){
                case TYPE_APP:
                    holder1 = (ViewHolder1) convertView.getTag(R.id.Tag_APP);
                    break;
                case TYPE_BOOK:
                    holder2 = (ViewHolder2) convertView.getTag(R.id.Tag_Book);
                    break;
            }
        }

        Object obj = mData.get(position);
        //設置下控件的值
        switch (type){
            case TYPE_APP:
                App app = (App) obj;
                if(app != null){
                    holder1.img_icon.setImageResource(app.getaIcon());
                    holder1.txt_aname.setText(app.getaName());
                }
                break;
            case TYPE_BOOK:
                Book book = (Book) obj;
                if(book != null){
                    holder2.txt_bname.setText(book.getbName());
                    holder2.txt_bauthor.setText(book.getbAuthor());
                }
                break;
        }
        return convertView;
    }


    //兩個不同的ViewHolder
    private static class ViewHolder1{
        ImageView img_icon;
        TextView txt_aname;
    }

    private static class ViewHolder2{
        TextView txt_bname;
        TextView txt_bauthor;
    }
}

這裡有個地方要注意的,convertView.setTag(R.id.Tag_APP,holder1);我們平時都直接 setTag(Object)的,這個是setTag的重載方法,參數是一個唯一的key以及後面的一個對象! 唯一!!!我一開始直接把TYPE_BOOK作為第一個參數,然後就報下面這個錯誤:

The key must be an application-specific resource id 就是前面這個要唯一,定義一個final類型的int變量和硬編碼一個值的方式都是行不通的 這裡的做法是直接在strings.xml中添加:

<item name="Tag_APP" type="id"></item>
<item name="Tag_Book" type="id"></item>

當然你也可以在res/values/下另外創建一個ids.xml文件,把上面這段代碼貼上去! 除了這個還有一個要注意的地方,就是這個區分類別的標志要從0開始算,不然會報下面 這樣的錯誤:


MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int TYPE_BOOK = 0;
    private static final int TYPE_APP = 1;
    private ListView list_content;
    private ArrayList<Object> mData = null;
    private MutiLayoutAdapter myAdapter = null;

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

        //數據准備:
        mData = new ArrayList<Object>();
        for(int i = 0;i < 20;i++){
            switch ((int)(Math.random() * 2)){
                case TYPE_BOOK:
                    mData.add(new Book("《第一行代碼》","郭霖"));
                    break;
                case TYPE_APP:
                    mData.add(new App(R.mipmap.iv_icon_baidu,"百度"));
                    break;
            }
        }

        list_content = (ListView) findViewById(R.id.list_content);
        myAdapter = new MutiLayoutAdapter(MainActivity.this,mData);
        list_content.setAdapter(myAdapter);
    }
}

上面隨機生成0和1,0就往集合中添加一個Book的對象,1的話就添加一個App的對象!


3.代碼下載:

ListViewDemo6.zip


本節小結:

好的,本節給大家講解了ListView Item多布局的實現,就是兩個方法的重寫, 然後getView()做下判斷,設置不同的布局而已~代碼非常簡單~

關於ListView的知識就告一段落吧,當然ListView的知識並不止這些, 異步加載,優化等等,這些我們都會在進階部分進行學習~就說這麼多,謝謝~

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved