在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>
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; } }
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; } }
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(); } }); }}
下面是原文链接:
http://android.leocardz.com/multiple-layout-listview/
0 0
- 在ListView中使用多样的布局
- 在ListView中使用多个布局
- ListView的多样颜色设定
- 不同布局的Item在listView中显示
- [Android] ListView中getView的原理+如何在ListView中放置不同的布局
- 在android的listview中使用observer
- 在Android中关于ListView的使用
- 在Dialog布局中添加ListView
- 布局 能够在代码中使用的布局
- 多样式cell的排列使用
- 使用RecyclerView实现多样的View
- Android Listview中使用两种布局
- 在ListView控件的item布局中,进行item中控件的局部刷新。
- SwipeLayout在ListView中使用的使用的问题
- 在ScrollView中使用ListView
- 在ListView中使用SimpleAdapter
- 在ListView中使用 ArrayAdapter
- 在ListView中使用SimpleAdapter
- Lab1 Buffer OverFlow
- (指针)*p++ 自增p 还是p 所指向的变量?
- 我的编程学习之旅(1)
- [常用技巧]Url转义/Html转义/C#转义
- 第十三天
- 在ListView中使用多样的布局
- hdoj 1528 Card Game Cheater 【贪心模拟田忌赛马】
- Android volly解析(一) 初始Volley
- getResourceAsStream和getResource的用法及Demo实例
- Queue
- c++类成员函数后边加const
- Java并发编程:Lock
- 如何学习linux
- Python ConfigParser的使用