在ListView中使用多样的布局

来源:互联网 发布:js拼接html样式丢失 编辑:程序博客网 时间:2024/05/22 01:52

这个教程是关于如何在ListView中使用多种类型布局.

如果需要完成这个内容的话,你需要遵循以下步骤:

1.创建多种不同的item的布局

2.创建ListView对应的Adapter

3.在创建的Adapter中重写getViewTypeCount()方法,并且在返回值中指定布局类型的个数

4.在Adapter中重写getItemViewType(int position)方法,返回当前item对应的布局类型

5.不用多说,使用ViewHolder机制来避免内存泄露


首先我们来定制自己需要的item布局类型,在这个例子中,我们使用4种类型的Layout:

// even <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:background="#ff500000"    android:layout_height="match_parent">    <TextView        android:id="@+id/text"        android:textColor="@android:color/white"        android:layout_width="match_parent"        android:layout_gravity="center"        android:textSize="24sp"        android:layout_height="wrap_content" /> </LinearLayout>

// odd <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:background="#ff001f50"    android:gravity="right"    android:layout_height="match_parent">    <TextView        android:id="@+id/text"        android:textColor="@android:color/white"        android:layout_width="wrap_content"        android:layout_gravity="center"        android:textSize="28sp"        android:layout_height="wrap_content"  /> </LinearLayout>


// white <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:background="#ffffffff"    android:gravity="right"    android:layout_height="match_parent">    <TextView        android:id="@+id/text"        android:textColor="@android:color/black"        android:layout_width="wrap_content"        android:layout_gravity="center"        android:textSize="28sp"        android:layout_height="wrap_content"   /> </LinearLayout>


// black <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:background="#ff000000"    android:layout_height="match_parent">    <TextView        android:id="@+id/text"        android:textColor="@android:color/white"        android:layout_width="wrap_content"        android:layout_gravity="center"        android:textSize="33sp"        android:layout_height="wrap_content"   /> </LinearLayout>


然后,我们来创建ListView中需要的item,在我们的例子中有一个string和type变量:

public class ListViewItem {        private String text;        private int type;        public ListViewItem(String text, int type) {            this.text = text;            this.type = type;        }        public String getText() {            return text;        }        public void setText(String text) {            this.text = text;        }        public int getType() {            return type;        }        public void setType(int type) {            this.type = type;        }    }

然后我们来创建一个ViewHolder,这个是强制要求的,因为android系统将会在item从屏幕中消失和重新返回的时候,保持对布局内容的引用来重用item.如果不使用这种方式,那么android系统会在item每一次出现在屏幕上的时候进行重新创建并且导致你的app内存泄露.

ViewHolder的编写如下:

public class ViewHolder {        TextView text;        public ViewHolder(TextView text) {            this.text = text;        }        public TextView getText() {            return text;        }        public void setText(TextView text) {            this.text = text;        }    }


最后我们将创建我们需要的adapter,并且重写getViewTypeCount() 和getItemViewType(int position)这两个方法:

public class CustomAdapter extends ArrayAdapter {        public static final int TYPE_ODD = 0;        public static final int TYPE_EVEN = 1;        public static final int TYPE_WHITE = 2;        public static final int TYPE_BLACK = 3;        private ListViewItem[] objects;        @Override        public int getViewTypeCount() {            return 4;        }        @Override        public int getItemViewType(int position) {            return objects[position].getType();        }        public CustomAdapter(Context context, int resource, ListViewItem[] objects) {            super(context, resource, objects);            this.objects = objects;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder viewHolder = null;            ListViewItem listViewItem = objects[position];            int listViewItemType = getItemViewType(position);            if (convertView == null) {                if (listViewItemType == TYPE_EVEN) {                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.type_even, null);                } else if (listViewItemType == TYPE_ODD) {                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.type_odd, null);                } else if (listViewItemType == TYPE_WHITE) {                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.type_white, null);                } else {                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.type_black, null);                }                TextView textView = (TextView) convertView.findViewById(R.id.text);                viewHolder = new ViewHolder(textView);                convertView.setTag(viewHolder);            } else {                viewHolder = (ViewHolder) convertView.getTag();            }            viewHolder.getText().setText(listViewItem.getText());            return convertView;        }    }


这样我们就可以应用在Activity中了:

public class MainActivity extends ActionBarActivity {    private ListView listView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main); // here, you can create a single layout with a listview        listView = (ListView) findViewById(R.id.listview);        final ListViewItem[] items = new ListViewItem[40];        for (int i = 0; i < items.length; i++) {            if (i == 4) {                items[i] = new ListViewItem("White " + i, CustomAdapter.TYPE_WHITE);            } else if (i == 9) {                items[i] = new ListViewItem("Black " + i, CustomAdapter.TYPE_BLACK);            } else if (i % 2 == 0) {                items[i] = new ListViewItem("EVEN " + i, CustomAdapter.TYPE_EVEN);            } else {                items[i] = new ListViewItem("ODD " + i, CustomAdapter.TYPE_ODD);            }        }        CustomAdapter customAdapter = new CustomAdapter(this, R.id.text, items);        listView.setAdapter(customAdapter);        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView adapterView, View view, int i, long l) {                Toast.makeText(getBaseContext(), items[i].getText(), Toast.LENGTH_SHORT).show();            }        });    }}


效果图如下:(图片csdn传不上,所以自行脑补吧)

下面是原文链接:

http://android.leocardz.com/multiple-layout-listview/










0 0
原创粉丝点击