工作中經常遇到一個listView裏面的item是不同樣式的,以前考慮的是在getView實現不同的樣式,那樣的話效率應該低,也沒有那麼方便,下面就把最近新學到的東西整理下。就是圖文混排的一個listView 其實很簡單。
主要是getItemViewType()和getViewTypeCount()的使用
實體數據類 很簡單
創建mainActivity
代碼很簡單,ItemData是一個實體bean類,裏面只有一個id,和一個type都是int類型,和一個構造方法 MainActivity主要是設置數據list 和 設置adapter
三個Xml佈局主要用來顯示三種不同類型的item 其中一個圖片 item_imageview.xml 和一個文本 item_text.xml 和一個按鈕 item_button.xml
/**
主要的adapter
*/
public class ImageTextAdapter extends BaseAdapter implements View.OnClickListener {
private Context mContext;//上下文
private ArrayList<ItemData> mList;//MainActivity傳過來的數據
private LayoutInflater mInflater;//用來加載佈局
public ImageTextAdapter(Context context, ArrayList<ItemData> mList) {
this.mContext = context;
this.mList = mList;
mInflater = LayoutInflater.from(mContext);
}
/**
主要是這個方法 雖然很簡單 ,但是很實用,且容易被忽視。
這個方法是adapter裏面可以重寫的得到item的類型
返回的是根據position得到數據裏的類型
*/
@Override
public int getItemViewType(int position) {
return mList.get(position).type;
}
/**
得到類型的條數 也就是說 這個listView一共支持幾種類型的展示形式
可以理解成是要加載幾個item的xml文件
*/
@Override
public int getViewTypeCount() {
return mList.size();
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
/**
主要是這個方法在返回的時候可以進行邏輯的處理,根據需求返回需要的樣式
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
int type=getItemViewType(position);//根據Position得到類型
if (convertView==null){
holder=new ViewHolder();
//根據類型設置viewHoder
if (type==1){
convertView=mInflater.inflate(R.layout.item_imageview,null);
holder.imageView= (ImageView) convertView.findViewById(R.id.imageView);
holder.imageView2= (ImageView) convertView.findViewById(R.id.imageView2);
}else if(type==2){
convertView=mInflater.inflate(R.layout.itme_text,null);
holder.textView= (TextView) convertView.findViewById(R.id.tv_item);
}else {
convertView=mInflater.inflate(R.layout.itme_button,null);
holder.button= (Button) convertView.findViewById(R.id.button);
}
convertView.setTag(holder);
}else{
holder= (ViewHolder) convertView.getTag();
}
//根據類型做相應的邏輯處理或者顯示不同的數據頁面內容
if(1==type){
holder.imageView.setOnClickListener(this);
holder.imageView2.setOnClickListener(this);
holder.imageView.setTag(position);
holder.imageView2.setTag(position);
}else if(2==type){
holder.textView.setOnClickListener(this);
holder.textView.setTag(position);
}else{
holder.button.setOnClickListener(this);
holder.button.setTag(position);
}
return convertView;
}
//展示通過setTag方式彈出吐司 證明可以實現
@Override
public void onClick(View v) {
int position= (int) v.getTag();
Toast.makeText(mContext,"position--->"+position,Toast.LENGTH_SHORT).show();
}
static class ViewHolder{
public TextView textView;
public ImageView imageView;
public ImageView imageView2;
public Button button;
}
}
最終的顯示效果