Android ListView多布局*

使用listview多布局会出现一点问题:

由于多个item布局给单一的item布局是不一样的,使用起来,contentview的复用会出现问题。

避免出现问题的有这几个方法:

1.重写 getViewTypeCount() – 该方法返回多少个不同的布局

2.重写 getItemViewType(int) – 根据position返回相应的Item. type的值必须从0开始

3.根据view item的类型,在getView中创建正确的convertView


public class MyAdapter extends BaseAdapter {
    Context mContext;
    LinearLayout linearLayout = null;
    LayoutInflater inflater;
    TextView tex;
    final int VIEW_TYPE = 3;
    final int TYPE_1 = 0;
    final int TYPE_2 = 1;
    final int TYPE_3 = 2;

    public MyAdapter(Context context) {
        mContext = context;
        inflater = LayoutInflater.from(mContext);
    }

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

    //每个convert view都会调用此方法,获得当前所需要的view样式
    @Override
    public int getItemViewType(int position) {
        //根据具体的ITME类型返回
        return type;
    }

    // 返回三个不同的布局
    @Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public Object getItem(int arg0) {
        return listString.get(arg0);
    }

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

    // 创建正确的contentview复用
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        viewHolder1 holder1 = null;
        viewHolder2 holder2 = null;
        viewHolder3 holder3 = null;
        int type = getItemViewType(position);
        // 无convertView,需要new出各个控件
        if (convertView == null) {
            Log.e("convertView = ", " NULL");
            // 按当前所需的样式,确定new的布局
            switch (type) {
            case TYPE_1:
                convertView = inflater.inflate(R.layout.listitem1, parent, false);
                holder1 = new viewHolder1();
                holder1.textView = (TextView) convertView.findViewById(R.id.textview1);
                holder1.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
                Log.e("convertView = ", "NULL TYPE_1");
                convertView.setTag(holder1);
                break;
            case TYPE_2:
                convertView = inflater.inflate(R.layout.listitem2, parent, false);
                holder2 = new viewHolder2();
                holder2.textView = (TextView) convertView.findViewById(R.id.textview2);
                Log.e("convertView = ", "NULL TYPE_2");
                convertView.setTag(holder2);
                break;
            case TYPE_3:
                convertView = inflater.inflate(R.layout.listitem3, parent, false);
                holder3 = new viewHolder3();
                holder3.textView = (TextView) convertView.findViewById(R.id.textview3);
                holder3.imageView = (ImageView) convertView.findViewById(R.id.imageview);
                Log.e("convertView = ", "NULL TYPE_3");
                convertView.setTag(holder3);
                break;
            }
        } else {
            // 有convertView,按样式,取得不用的布局
            switch (type) {
            case TYPE_1:
                holder1 = (viewHolder1) convertView.getTag();
                Log.e("convertView !!!!!!= ", "NULL TYPE_1");
                break;
            case TYPE_2:
                holder2 = (viewHolder2) convertView.getTag();
                Log.e("convertView !!!!!!= ", "NULL TYPE_2");
                break;
            case TYPE_3:
                holder3 = (viewHolder3) convertView.getTag();
                Log.e("convertView !!!!!!= ", "NULL TYPE_3");
                break;
            }
        }

        // 设置资源
        switch (type) {
        case TYPE_1:
            holder1.textView.setText(Integer.toString(position));
            holder1.checkBox.setChecked(true);
            break;
        case TYPE_2:
            holder2.textView.setText(Integer.toString(position));

            break;
        case TYPE_3:
            holder3.textView.setText(Integer.toString(position));
            holder3.imageView.setBackgroundResource(R.mipmap.ic_launcher);
            break;
        }

        return convertView;
    }
}

// 各个布局的控件资源
class viewHolder1 {
    CheckBox checkBox;
    TextView textView;
}

class viewHolder2 {
    TextView textView;
}

class viewHolder3 {
    ImageView imageView;
    TextView textView;
}
下面是四个xml布局:
activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    tools:context="com.example.listview_more.MainActivity">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        ></ListView>
</RelativeLayout>
listitem1

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hahaahha"
        />
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>
listitem2

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/textview2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="1111111"
        />
</LinearLayout>
listitme3
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/textview3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="888888888"
        />
    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

 

posted @ 2018-09-14 17:14  chenxibobo  阅读(1088)  评论(0编辑  收藏  举报