1. 程式人生 > >Android ListView不同的item佈局實現

Android ListView不同的item佈局實現

類似與這個 聊天效果 和 進入直播間


注意 在使用不同佈局的時候,在介面卡中 getItemViewType和getViewTypeCount不能少,一般的同一種item的列表是不用這兩個函式的過載的,但是如果需要不同種類的item,就必須過載這兩個


下面來看具體例子


public class VideoMessageAdapter extends BaseAdapter {

    private final ForegroundColorSpan redSpan;
    private final ForegroundColorSpan graySpan
; private final ForegroundColorSpan yeSpan; private Context mContext; private ViewHolder1 holder1; private ViewHolder2 holder2; private List<String> data; private String name; private final int TYPE_1 = 0; private final int TYPE_2 = 1; private int index; //名字的長度,用於字型著色
public VideoMessageAdapter(Context context, List<String> data) { this.mContext = context; this.data = data; //ForegroundColorSpan 為文字前景色,BackgroundColorSpan為文字背景色 redSpan = new ForegroundColorSpan(context.getResources().getColor(R.color.video_text_color_red));
graySpan = new ForegroundColorSpan(context.getResources().getColor(R.color.video_text_color_green)); yeSpan = new ForegroundColorSpan(context.getResources().getColor(R.color.luxury_gold)); } @Override public int getCount() { return data == null ? 0 : data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } public void NotifyAdapter(List<String> data,int index) { this.data = data; this.index = index; notifyDataSetChanged(); } @Override public int getItemViewType(int position) { // TODO Auto-generated method stub if (position == data.size() - 1) return TYPE_2; else return TYPE_1; } @Override public int getViewTypeCount() { // TODO Auto-generated method stub return 2; } @Override public View getView(int position, View convertView, ViewGroup parent) { holder1 = null; holder2 = null; int type = getItemViewType(position); if (convertView == null) { switch (type) { case TYPE_1: holder1 = new ViewHolder1(); convertView = View.inflate(mContext, R.layout.item_messageadapter, null); holder1.tvcontent1 = (TextView) convertView.findViewById(R.id.tvcontent); convertView.setTag(holder1); break; case TYPE_2: holder2 = new ViewHolder2(); convertView = View.inflate(mContext, R.layout.item_messageadapter1, null); holder2.tvcontent2 = (TextView) convertView.findViewById(R.id.tvcontent1); convertView.setTag(holder2); break; } } else { switch (type) { case TYPE_1: holder1 = (ViewHolder1) convertView.getTag(); break; case TYPE_2: holder2 = (ViewHolder2) convertView.getTag(); break; } } switch (type) { case TYPE_1: holder1.tvcontent1.setText(data.get(position)); if (position % 2 == 0) { //這裡注意一定要先給textview賦值 SpannableStringBuilder builder = new SpannableStringBuilder(holder1.tvcontent1.getText().toString()); //為不同位置字串設定不同顏色 builder.setSpan(graySpan, 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //最後為textview賦值 holder1.tvcontent1.setText(builder); } else if (position % 3 == 1) { //這裡注意一定要先給textview賦值 SpannableStringBuilder builder = new SpannableStringBuilder(holder1.tvcontent1.getText().toString()); //為不同位置字串設定不同顏色 builder.setSpan(redSpan, 0, 13, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //最後為textview賦值 holder1.tvcontent1.setText(builder); } else { //這裡注意一定要先給textview賦值 SpannableStringBuilder builder = new SpannableStringBuilder(holder1.tvcontent1.getText().toString()); //為不同位置字串設定不同顏色 builder.setSpan(graySpan, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //最後為textview賦值 holder1.tvcontent1.setText(builder); } break; case TYPE_2: holder2.tvcontent2.setText(data.get(position)); //這裡注意一定要先給textview賦值 SpannableStringBuilder builder = new SpannableStringBuilder(holder2.tvcontent2.getText().toString()); //為不同位置字串設定不同顏色 builder.setSpan(yeSpan, 0, index, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //最後為textview賦值 holder2.tvcontent2.setText(builder); break; } return convertView; } private final class ViewHolder1 { TextView tvcontent1; } private final class ViewHolder2 { TextView tvcontent2; } }
大概就到這了  祝大家編輯程式碼愉快!