前言
以前我們總是用到listview顯示數據,但是每個數據都長得差不多,但是實際需求卻經常不是這樣的,如果我要一個listview顯示多種佈局,那應該怎麼辦呢?
其實想要實現這樣的功能並不難,關鍵就是在listview的適配器稍作修改,待會我會貼代碼。我一般都是繼承BaseAdapter這個來重寫適配器,因爲是父類,便於擴展。我們主要是重寫裏面的兩個方法,getViewTypeCount()和getItemViewType,相信看這個方法名就應該知道是什麼意思吧。
正文
這裏我主要是實現了一個listview,前面十個數據是一種佈局,後面十個數據是另一種佈局。如果你想要更多的佈局,那就隨你咯,反正原理都一樣。當然,你得建立兩個item的佈局,這裏我就不貼上來了,沒意義。
適配器代碼如下:
public class TwoItemsAdapter extends BaseAdapter {
private Context context;
private List<ItemBeanOne> list1;//第一個佈局的數據集
private List<ItemBeanTwo> list2;//第二個佈局的數據集
private LayoutInflater inflater;
private final int type1=0;//第一種佈局
private final int type2=1;//第二種佈局
public TwoItemsAdapter(Context context, List<ItemBeanOne> list1, List<ItemBeanTwo> list2) {
this.context = context;
this.list1 = list1;
this.list2 = list2;
inflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
int size= list1.size()+list2.size();
System.out.println("size"+size);
return size;
}
@Override
public Object getItem(int position) {
if(position<10){
return list1.get(position);
}else {
return list2.get(position);
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
if(position<10){
return type1;
}else {
return type2;
}
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolde1 holde1=null;
ViewHolde2 holde2=null;
int type=getItemViewType(position);
if(convertView==null){
switch (type){
case type1:
convertView=inflater.inflate(R.layout.item1, parent,false);
holde1=new ViewHolde1();
holde1.imageView= (ImageView) convertView.findViewById(R.id.id_img1);
holde1.title_tv= (TextView) convertView.findViewById(R.id.id_title_tv);
holde1.num_tv= (TextView) convertView.findViewById(R.id.id_num_tv);
ItemBeanOne beanOne=new ItemBeanOne();
beanOne=list1.get(position);
holde1.imageView.setImageResource(beanOne.getImageRes());
holde1.title_tv.setText(beanOne.getTitle());
holde1.num_tv.setText(beanOne.getNum());
convertView.setTag(holde1);
break;
case type2:
convertView=inflater.inflate(R.layout.item2,parent,false);
holde2=new ViewHolde2();
holde2.imageView= (ImageView) convertView.findViewById(R.id.id_img2);
holde2.one_tv= (TextView) convertView.findViewById(R.id.id_title2_tv);
holde2.two_tv= (TextView) convertView.findViewById(R.id.id_item2_two_tv);
holde2.three_tv= (TextView) convertView.findViewById(R.id.id_item2_three_tv);
holde2.four_tv= (TextView) convertView.findViewById(R.id.id_item2_four_tv);
holde2.logo_qq= (ImageView) convertView.findViewById(R.id.id_qq_img);
ItemBeanTwo two=new ItemBeanTwo();
two=list2.get(position-10);
holde2.imageView.setImageResource(two.getImgRes());
//這裏是實現一個TextView顯示不同顏色的字
String one_txt="<font color='black'>你是誰:</font>"+"<font color= 'blue'>"+two.getOne()+"</font>";
String two_txt="<font color='black'>我是誰:</font>"+"<font color= 'blue'>"+two.getTwo()+"</font>";
holde2.one_tv.setText(Html.fromHtml(one_txt));
holde2.two_tv.setText(Html.fromHtml(two_txt));
holde2.three_tv.setText(two.getThree());
holde2.four_tv.setText(two.getFour());
convertView.setTag(holde2);
}
}else {
switch (type){
case type1:
holde1= (ViewHolde1) convertView.getTag();
break;
case type2:
holde2= (ViewHolde2) convertView.getTag();
default:
break;
}
}
return convertView;
}
class ViewHolde1{
ImageView imageView;
TextView title_tv;
TextView num_tv;
}
class ViewHolde2{
ImageView imageView;
TextView one_tv;
TextView two_tv;
TextView three_tv;
TextView four_tv;
ImageView logo_qq;
}
}
調用適配代碼:
public class MainActivity extends AppCompatActivity {
private ListView listView;
private List<ItemBeanOne> ones=new ArrayList<ItemBeanOne>();//第一種數據
private List<ItemBeanTwo> twos=new ArrayList<ItemBeanTwo>();//第二種數據
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView= (ListView) findViewById(R.id.id_listview);
initDatas();
TwoItemsAdapter adapter=new TwoItemsAdapter(MainActivity.this,ones,twos);
listView.setAdapter(adapter);
}
/**
* 初始化數據
*/
private void initDatas() {
for(int i=0;i<10;i++){
ItemBeanOne one=new ItemBeanOne();
one.setImageRes(R.drawable.img_good1);
one.setTitle("(標題:.." + i);
one.setNum("" + i * 100);
ones.add(one);
}
for(int j=10;j<20;j++){
ItemBeanTwo two=new ItemBeanTwo();
two.setImgRes(R.drawable.img_good1);
two.setOne("" + Math.random()*100);
two.setTwo(""+j);
two.setThree("無語:");
two.setFour("找工作:");
twos.add(two);
}
}
}
是不是很簡單,就是這樣,好了不多寫了,投簡歷找工作去,太苦逼了。