ListView子布局样式有多个的处理

时间:2022-04-20 17:44:53

在开发中,ListView等类型的适配器控件的Item子布局很多时候都不是完全一样的,很可能有两个子布局样式,甚至更多的子布局样式,那么这种情况该怎么处理呢?

其实很简单,系统已经实现了加载多个子布局的方法,只需要在适配器中做相应处理即可。


在写ListView适配器时除了实现自动生成导入的必须重写的方法之外,还需要实现下面的两个方法:

《1》

public int getViewTypeCount() {}  返回子布局样式的个数。
《2》
 
public int getItemViewType(int position) {}   返回在ListView中position位置的Item呈现的子布局样式,当然这里的样式只是一个代号区分而已,具体样式是什么样的就应该在getView()方法里面返回对应样式的View即可。
《3》
 
public View getView(int position, View convertView, ViewGroup parent) {}
getView方法自然就与常规的不同了,需要去判断到底该返回什么样的子布局样式。
这里给个子布局有两种样式的适配器Demo例子:大家可以参考:
 
 
 /*XlistView的适配器*/
    public class XlistviewPlayAdapter extends BaseAdapter {
        ArrayList<ContentBean> data = new ArrayList<ContentBean>() ;
        private LayoutInflater inflater;
        private Context context;
        private final int VIEW_TYPE_COUNT = 2;  //子布局个数
        private final int TYPE_1 = 0;   //子布局 1
        private final int TYPE_2 = 1;   //
        public XlistviewPlayAdapter(Context context){
            this.context = context;
            inflater = LayoutInflater.from(context);
        }

        public void refreshData(ArrayList<ContentBean> list){
            this.data = list;  //这里变成添加数据
            notifyDataSetChanged();
        }

        public void addData(ArrayList<ContentBean> list){
            this.data.addAll(list);  //这里变成添加数据
            notifyDataSetChanged();
        }

        @Override
        public int getCount() {
            return data.size();
        }

        @Override
        public Object getItem(int position) {
            return data.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public int getViewTypeCount() {
            return VIEW_TYPE_COUNT;   //子布局个数
        }

        @Override
        public int getItemViewType(int position) {
            if (data.get(position).getImgextra() == null){   //以数据源中的某个标签来判断加载那个子布局样式
                return TYPE_1;
            }else{
                return TYPE_2;
            }
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = null;
            Handler mHandler = null;
            Type2_Handler type2_handler = null;
            int view_type = getItemViewType(position); //得到对应位置子布局类型

            if(convertView == null){   //逻辑判断
                switch (view_type){
                    case TYPE_1:
                        mHandler = new Handler();
                        v = inflater.inflate(R.layout.xlistview_item_layout, null);
                        mHandler.iconImg = (ImageView) v.findViewById(R.id.xlistview_item_img);
                        mHandler.titleTxt = (TextView) v.findViewById(R.id.xlistview_item_title_txt);
                        mHandler.contentTxt = (TextView) v.findViewById(R.id.xlistview_content_text);
                        v.setTag(mHandler);
                        break;
                    case TYPE_2:
                        type2_handler = new Type2_Handler();
                        v = inflater.inflate(R.layout.xlistview_item_typetwo_layout,null);
                        type2_handler.title = (TextView) v.findViewById(R.id.xlistview2_item_title_txt);
                        type2_handler.oneImg = (ImageView) v.findViewById(R.id.img_one);
                        type2_handler.twoImg = (ImageView) v.findViewById(R.id.img_two);
                        type2_handler.threeImg = (ImageView) v.findViewById(R.id.img_three);
                        v.setTag(type2_handler);
                        break;
                }
            }else{
                switch (view_type){
                    case TYPE_1:
                        v = convertView;
                        mHandler = (Handler) v.getTag();
                        break;
                    case TYPE_2:
                        v = convertView;
                        type2_handler = (Type2_Handler) v.getTag();
                        break;
                }
            }

            ContentBean news = (ContentBean) getItem(position); //JAVABean对象
            //设置数据
            switch (view_type){
                case TYPE_1:
                    mHandler.titleTxt.setText(news.getTitle());
                    mHandler.contentTxt.setText(news.getDigest());
                    //mHandler.iconImg
                    Picasso.with(context).load(news.getImgsrc()).into(mHandler.iconImg);
                    break;
                case TYPE_2:
                    type2_handler.title.setText(news.getTitle());
                    ArrayList<ThreeprictureUrlBean> list = news.getImgextra();
                    Picasso.with(context).load(((ThreeprictureUrlBean)list.get(0)).getImgsrc())
                            .into(type2_handler.oneImg);
                    Picasso.with(context).load(((ThreeprictureUrlBean)list.get(1)).getImgsrc())
                            .into(type2_handler.twoImg);
                    Picasso.with(context).load(news.getImgsrc()).into(type2_handler.threeImg);
                    break;
            }
            return v;
        }

        //保存控件,有几个子布局就有多少个这样的类
        class Handler{
            ImageView iconImg;
            TextView titleTxt;
            TextView contentTxt;
        }

        class Type2_Handler{
            TextView title;
            ImageView oneImg,twoImg,threeImg;
        }

    }
两个样式的子布局: 
1.只有一张图片加两个TextView
 
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:padding="10dp">


    <ImageView
        android:id="@+id/xlistview_item_img"
        android:layout_width="110dp"
        android:layout_height="90dp"
        android:background="@mipmap/base_common_default_icon_xsmall"
        android:scaleType="centerCrop" />

    <TextView
        android:id="@+id/xlistview_item_title_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="2dp"
        android:layout_toRightOf="@id/xlistview_item_img"
        android:text="*将出席世界互联网大会"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/xlistview_content_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/xlistview_item_title_txt"
        android:layout_marginLeft="14dp"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@+id/xlistview_item_img"
        android:text="并发表主旨演讲:大会将在四川成都通惠门广场举行"
        android:textSize="15sp" />


</RelativeLayout>
2.显示三张图片加一个TextView: 
 
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:padding="10dp">
    
    <TextView
        android:id="@+id/xlistview2_item_title_txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="*将出席世界互联网大会"
        android:textSize="18sp" />

    <LinearLayout
        android:layout_below="@id/xlistview2_item_title_txt"
        android:layout_width="match_parent"
        android:layout_height="100dp">

        <ImageView
            android:id="@+id/img_one"
            android:layout_marginRight="3dp"
            style="@style/three_prcture" />
        <ImageView
            android:id="@+id/img_two"
            android:layout_marginRight="3dp"
            style="@style/three_prcture" />
        <ImageView
            android:id="@+id/img_three"
            style="@style/three_prcture" />

    </LinearLayout>




</RelativeLayout>

 
最后执行的就过就可以看到有不同的子布局呈现了。