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>
  • 相关阅读:
    csrf 跨站请求伪造
    apache 根据端口访问配置
    对于表单中单双引号问题
    svn常用命令
    urlencode和rawurlencode的区别
    php 显示某一个时间相当于当前时间在多少秒前,多少分钟前,多少小时前
    javaweb基础(24)_jsp一般的标签开发
    javaweb基础(23)_jsp自定义标签
    javaweb基础(22)_Servlet+JSP+JavaBean实战登陆
    javaweb基础(21)_两种开发模式
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/9647778.html
Copyright © 2011-2022 走看看