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>
  • 相关阅读:
    LeetCode 485. Max Consecutive Ones
    LeetCode 367. Valid Perfect Square
    LeetCode 375. Guess Number Higher or Lower II
    LeetCode 374. Guess Number Higher or Lower
    LeetCode Word Pattern II
    LeetCode Arranging Coins
    LeetCode 422. Valid Word Square
    Session 共享
    java NIO
    非阻塞IO
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/9647778.html
Copyright © 2011-2022 走看看