Android listview多布局

来源:互联网 发布:php手机电视直播源码 编辑:程序博客网 时间:2024/05/19 19:43

Android listview多布局

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

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

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

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

2.重写 getItemViewType(int) – 根据position返回相应的Item

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


MainActivity

import android.content.Context;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {    ListView listView;    MyAdapter listAdapter;    ArrayList<String> listString;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView) this.findViewById(R.id.listview);        listString = new ArrayList<String>();        for (int i = 0; i < 100; i++) {            listString.add(Integer.toString(i));        }        listAdapter = new MyAdapter(this);        listView.setAdapter(listAdapter);    }    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) {            // TODO Auto-generated constructor stub            mContext = context;            inflater = LayoutInflater.from(mContext);        }        @Override        public int getCount() {            // TODO Auto-generated method stub            return listString.size();        }        //每个convert view都会调用此方法,获得当前所需要的view样式        @Override        public int getItemViewType(int position) {            // TODO Auto-generated method stub            int p = position % 6;            if (p == 0)                return TYPE_1;            else if (p < 3)                return TYPE_2;            else if (p < 6)                return TYPE_3;            else                return TYPE_1;        }        //返回三个不同的布局        @Override        public int getViewTypeCount() {            // TODO Auto-generated method stub            return 3;        }        @Override        public Object getItem(int arg0) {            // TODO Auto-generated method stub            return listString.get(arg0);        }        @Override        public long getItemId(int position) {            // TODO Auto-generated method stub            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>