您的位置:首页 > 移动开发 > Android开发

Android中关于listview填充多个布局

2015-12-02 20:19 411 查看
首先在网上可以找到很多关于Scrollview嵌套listview的解决方法,确实是可以解决,但是这种方法貌似可能会对以后的开发带来许多麻烦,并且官方也并不推荐这种做法。Google官方的原文如下:

You should never use a ScrollView with a 
ListView
,
because ListView takes care of its own vertical scrolling. Most importantly, doing this defeats all of the important optimizations in ListView for dealing with large lists, since it effectively forces the ListView to display its entire list of items to fill
up the infinite container supplied by ScrollView.

网址:http://developer.android.com/intl/zh-cn/reference/android/widget/ScrollView.html

我的解决思路是在Listview中填充多个布局。假设现在有两种类型的布局,第一个Item是一张图片,其他Item是另一种类型的Item。我们可以使用getItemViewType()对两种类型的Item做区分,在这里我们还要重写getViewTypeCount()

首先声明初始化变量:

//listview中填充的第一种类型
private static final int ITEM_ONE = 0;
//listview中填充的第二张类型
private static final int ITEM_LEFT = 1;

/*listview总共要填充的类型, 这个很重要,需要重写getViewTypeCount()这个方法,不然在后面使用
getView()的时候viewHolder会出现类型转换错误。
*/
private static final int ITEM_COUNT = 2;


跟着重写getItemViewType()和getViewTypeCount()

public int getItemViewType(int position) {
if (position == ITEM_ONE) {
return ITEM_ONE;
} else {
return ITEM_LEFT;
}
}

public int getViewTypeCount() {
return ITEM_COUNT;
}


然后重写getView()方法:

public View getView(int position, View convertView, ViewGroup parent) {
SickerListviewInfo sickerListviewInfo = (SickerListviewInfo) getItem(position);
int viewType = this.getItemViewType(position);
ViewHolder viewHolder = new ViewHolder();
View view = convertView;
switch (viewType) {
case ITEM_ONE:
if (view == null) {
view = mLayourInflater.inflate(R.layout.first_item, parent, false);
viewHolder.graph = (ImageView) view.findViewById(R.id.graph_IV);

view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.graph.setBackgroundResource(R.mipmap.graph);
return view;
case ITEM_LEFT:
if (view == null) {
viewHolder = new ViewHolder();
view = mLayourInflater.inflate(resourceId, null);
viewHolder.head_icon = (ImageView) view.findViewById(R.id.head_icon);
viewHolder.time_iv = (ImageView) view.findViewById(R.id.time_iv);
viewHolder.date_iv = (ImageView) view.findViewById(R.id.date_iv);
viewHolder.editsicker = (ImageButton) view.findViewById(R.id.edit_sicker);
viewHolder.name = (TextView) view.findViewById(R.id.name);
viewHolder.time_tv = (TextView) view.findViewById(R.id.time_tv);
viewHolder.date_tv = (TextView) view.findViewById(R.id.date_tv);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.head_icon.setBackgroundResource(sickerListviewInfo.getHead_icon());
viewHolder.time_iv.setBackgroundResource(sickerListviewInfo.getTime_iv());
viewHolder.date_iv.setBackgroundResource(sickerListviewInfo.getDate_iv());
viewHolder.editsicker.setBackgroundResource(sickerListviewInfo.getEdit_sicker());
viewHolder.name.setText(sickerListviewInfo.getName());
viewHolder.time_tv.setText(sickerListviewInfo.getTime_tv());
viewHolder.date_tv.setText(sickerListviewInfo.getDate_tv());
return view;
default:
break;
}
return null;
}

class ViewHolder {
public ImageView head_icon;
public ImageView time_iv;
public ImageView date_iv;
public ImageButton editsicker;
public TextView name;
public TextView time_tv;
public TextView date_tv;
public ImageView graph;
}


效果图

只是简单介绍了实现思路,具体的话可以自己实现。。有一个思路然后尝试自己造轮子对自己才会进步。

水平有限,写的不好的地方可以指出来。互相学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview Item