1. 程式人生 > >UI控制元件--ListView補充:包含多個子項佈局的列表

UI控制元件--ListView補充:包含多個子項佈局的列表

  • 效果圖
    這裡寫圖片描述

  • 首先分別定義三個不同的子項item佈局

  • 佈局一
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width
="wrap_content" android:layout_height="wrap_content" android:text="右邊的訊息" android:textColor="#000000" android:layout_toLeftOf="@+id/imageView_right" android:id="@+id/textView_right" />
<ImageView android:layout_width="50dp" android:layout_height
="50dp" android:id="@+id/imageView_right" android:layout_alignParentRight="true" />
</RelativeLayout>
  • 對應的bean檔案
public class MessageRight implements Type{
    private String msg;
    private int picId;

    public MessageRight(String msg, int picId) {
        this.msg = msg;
        this
.picId = picId; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public int getPicId() { return picId; } public void setPicId(int picId) { this.picId = picId; } @Override public int getType() { return MyManyAdapter.TYPE_RIGHT; } }
  • 佈局二、三於此基本一致,就不再贅述。

-請注意一點,這裡每一個bean類,都實現了一個介面,介面的程式碼如下

public interface Type {
    public int getType();
}
  • 可以看到介面中只有一個方法getType()
  • 這個介面的方法實現在自定義Adapter中用處很大

  • 對應的自定義Adapter

public class MyManyAdapter extends BaseAdapter {
    public static final int TYPE_TIME = 0;
    public static final int TYPE_LEFT = 1;
    public static final int TYPE_RIGHT =2;

    private Context context;
    //注意這裡接收的是Type型別的資料
    private List<Type> dataList;

    public MyManyAdapter(Context context, List<Type> dataList) {
        this.context = context;
        this.dataList = dataList;
    }

    @Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public int getItemViewType(int position) {
        return dataList.get(position).getType();
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolderLeft viewHolderLeft=null;
        ViewHolderRight viewHolderRight=null;
        ViewHolderTime viewHolderTime=null;
        int type = dataList.get(position).getType();
        if (convertView==null){
            switch (type){
                case TYPE_TIME:
                    viewHolderTime=new ViewHolderTime();
                    convertView= LayoutInflater.from(context).inflate(R.layout.layout_time,null);
                    viewHolderTime.textView= (TextView) convertView.findViewById(R.id.textView_time);
                    convertView.setTag(viewHolderTime);
                    break;
                case TYPE_LEFT:
                    viewHolderLeft=new ViewHolderLeft();
                    convertView=LayoutInflater.from(context).inflate(R.layout.layout_left,null);
                    viewHolderLeft.imageView= (ImageView) convertView.findViewById(R.id.imageView_left);
                    viewHolderLeft.textView= (TextView) convertView.findViewById(R.id.textView_left);
                    viewHolderLeft.button_left= (Button) convertView.findViewById(R.id.button_left);
                    convertView.setTag(viewHolderLeft);
                    break;
                case TYPE_RIGHT:
                    viewHolderRight=new ViewHolderRight();
                    convertView=LayoutInflater.from(context).inflate(R.layout.layout_right,null);
                    viewHolderRight.imageView= (ImageView) convertView.findViewById(R.id.imageView_right);
                    viewHolderRight.textView= (TextView) convertView.findViewById(R.id.textView_right);
                    convertView.setTag(viewHolderRight);
                    break;
            }
        }else{
            switch (type){
                case TYPE_TIME:
                    viewHolderTime= (ViewHolderTime) convertView.getTag();
                    break;
                case TYPE_LEFT:
                    viewHolderLeft= (ViewHolderLeft) convertView.getTag();
                    break;
                case TYPE_RIGHT:
                    viewHolderRight= (ViewHolderRight) convertView.getTag();
                    break;
            }
        }
        switch (type){
            case TYPE_TIME:
                MessageTime time= (MessageTime) dataList.get(position);
                viewHolderTime.textView.setText(time.getTime());
                viewHolderTime.textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context, "時間被點選了", Toast.LENGTH_SHORT).show();
                    }
                });
                break;
            case TYPE_LEFT:
                MessageLeft messageLeft= (MessageLeft) dataList.get(position);
                viewHolderLeft.imageView.setImageResource(messageLeft.getPicId());
                viewHolderLeft.textView.setText(messageLeft.getMsg());
                viewHolderLeft.button_left.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context, "左邊的按鈕被點選了", Toast.LENGTH_SHORT).show();
                    }
                });
                viewHolderLeft.imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context, "左邊的圖片被點選", Toast.LENGTH_SHORT).show();
                    }
                });
                break;
            case TYPE_RIGHT:
                MessageRight messageRight= (MessageRight) dataList.get(position);
                viewHolderRight.imageView.setImageResource(messageRight.getPicId());
                viewHolderRight.textView.setText(messageRight.getMsg());
                viewHolderRight.imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context, "右邊的圖片被點選", Toast.LENGTH_SHORT).show();
                    }
                });
                break;
        }


        return convertView;
    }

    class ViewHolderLeft {
        ImageView imageView;
        TextView textView;
        Button button_left;
    }

    class ViewHolderRight {
        ImageView imageView;
        TextView textView;
    }

    class ViewHolderTime {
        TextView textView;
    }
}
  • 注意這裡新增加的兩個複寫的方法
@Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public int getItemViewType(int position) {
        return dataList.get(position).getType();
    }
  • getViewTypeCount() ,用於返回自定義子項不同佈局的數目,有幾種不同的子項佈局,就返回幾
  • getItemViewType(),用於效率優化的時候,判斷記憶體中是否有你正要載入的子項的佈局快取,因為當前劃出螢幕的item佈局不一定與正在生成的子項是同一個佈局,這裡就需要這個方法來判斷一下,記憶體中是否有可以複用的佈局。

  • 還有一個小細節
    @Override

  • 在getView()方法中,獲取type的設定很巧妙
  • private List dataList;
  • 首先我們定義的儲存資料的list泛型是Type,這樣就可以講三種實現Type介面的bean類例項都放進去
  • int type = dataList.get(position).getType();
  • 然後再getView()方法應用了向下轉型,來獲取Type
  • 最後,格局獲取到的type來判斷載入哪一個子項佈局,在設定監聽事件等思路就非常清晰了。
  • 基本思路就是這樣的,大概程式碼還需要自行嘗試。