zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    共享库的使用(.so)文件
    C/C++ 的宏中#和##的作用和展开
    有趣的打字训练
    libtool 创建库的工具
    vcpkg-微软开发的VC++打包工具
    Q他中的乱码再理解
    关于头文件和源文件的分别
    std::set 中内部元素有序条件删除的理解
    python 的 字节码 导入使用
    Pychar-20170301快捷键
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/9647778.html
Copyright © 2011-2022 走看看