1、關於listView多個佈局複用的問題,主要是重寫一個方法,通過該方法在不同的位置設置不同的類型,這裏共兩種類型,不同條件是返回不同的類型,然後在getview方法中通過不同的類型加載不同的佈局,具體的邏輯在後面的代碼中實現
獲取每一個item的類型
@Override
public int getItemViewType(int position) {
if (personalNewses.get(position).getIs_read() == 0) {
return WITH_POINT;
}
return WITHOUT_POINT;
}
2、整個adapter如下
/**
* 個人消息適配器
* Created by leven on 2016/11/25.
*/
public class PersonalNewsAdapter extends BaseAdapter {
private static final int WITH_POINT = 0x0;//帶紅色圓點的佈局
private static final int WITHOUT_POINT = 0x1;//不帶紅色原點的已讀消息;
private Context context;
private List<PersonalNews> personalNewses = new ArrayList<>();
public PersonalNewsAdapter(Context context, List<PersonalNews> personalNewses) {
this.context = context;
if (personalNewses != null) {
this.personalNewses = personalNewses;
}
}
public void setPersonalNewses(List<PersonalNews> personalNewses) {
if (personalNewses != null) {
this.personalNewses = personalNewses;
}
}
@Override
public int getCount() {
return personalNewses.size();
}
@Override
public PersonalNews getItem(int i) {
return personalNewses.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public int getItemViewType(int position) {
if (personalNewses.get(position).getIs_read() == 0) {
return WITH_POINT;//isRead爲0時返回該類型
}
return WITHOUT_POINT;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder vh_with_point = null;//不同的佈局使用不同的ViewHolder對象
ViewHolder vh_without_point = null;
int pointYype = getItemViewType(i);
//根據類型判斷選用哪種佈局
switch (pointYype) {
case WITH_POINT:
//此處有個技巧,view爲空,加載佈局時放入else中
if (view != null && view instanceof NewsItemWithPointLayout) {
vh_with_point = (ViewHolder) view.getTag();
} else {
view = LayoutInflater.from(context).inflate(R.layout.item_personal_news, null);
vh_with_point = new ViewHolder();
vh_with_point.tv_title = (TextView) view.findViewById(R.id.tv_title);
vh_with_point.tv_type = (TextView) view.findViewById(R.id.tv_type);
vh_with_point.tv_circle_point = (TextView) view.findViewById(R.id.tv_circle_point);
vh_with_point.tv_priority = (TextView) view.findViewById(R.id.tv_priority);
view.setTag(vh_with_point);
}
if (personalNewses != null && personalNewses.size() > 0) {
vh_with_point.tv_circle_point.setVisibility(View.VISIBLE);
BadgeView badgeView = new BadgeView(context);
badgeView.setBadgeCount(1);
badgeView.setWidth(20);
badgeView.setHeight(20);
badgeView.setTextColor(Color.RED);
badgeView.setBackground(10, Color.RED);
badgeView.setGravity(Gravity.CENTER_VERTICAL);
badgeView.setBadgeMargin(0, 12, 0, 0);
badgeView.setTargetView(vh_with_point.tv_circle_point);
//設置標題
vh_with_point.tv_title.setText(personalNewses.get(i).getTitle());
//設置類型
int type = personalNewses.get(i).getType();
if (type == 0) {
vh_with_point.tv_type.setText("溝通");
} else if (type == 1) {
vh_with_point.tv_type.setText("通知");
} else if (type == 2) {
vh_with_point.tv_type.setText("應答");
}
//設置優先級別
int pri = personalNewses.get(i).getPri();
if (pri == 1) {
vh_with_point.tv_priority.setText("知會");
} else if (pri == 2) {
vh_with_point.tv_priority.setText("普通");
} else if (pri == 3) {
vh_with_point.tv_priority.setText("緊急");
}
}
break;
case WITHOUT_POINT:
if (view != null && view instanceof NewsItemWithoutPointLayout) {
vh_without_point = (ViewHolder) view.getTag();
} else {
view = LayoutInflater.from(context).inflate(R.layout.item_personal_news_not_point, null);
vh_without_point = new ViewHolder();
vh_without_point.tv_title = (TextView) view.findViewById(R.id.tv_title);
vh_without_point.tv_type = (TextView) view.findViewById(R.id.tv_type);
// vh_without_point.tv_circle_point = (TextView) view.findViewById(R.id.tv_circle_point);
vh_without_point.tv_priority = (TextView) view.findViewById(R.id.tv_priority);
view.setTag(vh_without_point);
}
if (personalNewses != null && personalNewses.size() > 0) {
//設置標題
vh_without_point.tv_title.setText(personalNewses.get(i).getTitle());
//設置類型
int type = personalNewses.get(i).getType();
if (type == 0) {
vh_without_point.tv_type.setText("溝通");
} else if (type == 1) {
vh_without_point.tv_type.setText("通知");
} else if (type == 2) {
vh_without_point.tv_type.setText("應答");
}
//設置優先級別
int pri = personalNewses.get(i).getPri();
if (pri == 1) {
vh_without_point.tv_priority.setText("知會");
} else if (pri == 2) {
vh_without_point.tv_priority.setText("普通");
} else if (pri == 3) {
vh_without_point.tv_priority.setText("緊急");
}
}
break;
}
return view;
}
class ViewHolder {
TextView tv_title;
TextView tv_type;
TextView tv_priority;
TextView tv_circle_point;
}
}
總結:ListView的使用較爲靈活,加載多個佈局時建議使用RecycleView(ViewHolder的優化更好,而且可以水平顯示,可以瀑布流),而ListView緊可以垂直顯示,有一定的缺陷,推薦RecycleView。