ListView加載不同佈局

前言

以前我們總是用到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);
        }
    }
}
是不是很簡單,就是這樣,好了不多寫了,投簡歷找工作去,太苦逼了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章