UI控制元件--ListView補充:包含多個子項佈局的列表
阿新 • • 發佈:2019-02-13
效果圖
首先分別定義三個不同的子項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來判斷載入哪一個子項佈局,在設定監聽事件等思路就非常清晰了。
- 基本思路就是這樣的,大概程式碼還需要自行嘗試。