package cc.testlistview;
import java.util.ArrayList;
import java.util.HashMap;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.app.Activity;
/** * Demo描述:
* 为ListView的Item设置不同的布局.
* 例如在该例子中ListView的第一个Item显示一张
* 图片,其余的Item都显示文字.
*
* 为了达到此目的需要重写BaseAdapter中的
* 1 getViewTypeCount()和getItemViewType(int position)方法.
* 1.1在getViewTypeCount中指定一共有几种不同的item
* 在此返回2即可.
* 1.2在getItemViewType(int position)中需要依据position的不同
* 返回不同的Type.
* 2 在getView()方法中针对不同的Type为Item设置布局
* 2.1得到当前位置(position)时的Type即代码:
* currentType= getItemViewType(position);
* 2.2依据Type的不同为Item设置布局
*
* 参考资料:
* Thank you very much
*/ public class MainActivity extends Activity {
private ListView mListView;
private HashMap<String, Object> mHashMap;
private ArrayList<HashMap<String, Object>> mArrayList;
@Override protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
mArrayList= new ArrayList<HashMap<String,Object>>();
mListView=(ListView) findViewById(R.id.listview);
addDataForListView();
mListView.setAdapter
( new ListViewAdapter(MainActivity. this , mArrayList, R.layout.othersitem, new String []{ "content" }, new int []{R.id.textView}));
mListView.setOnItemClickListener( new ItemClickListenerImpl());
}
private void addDataForListView(){
for ( int i = 0 ; i < 30 ; i++) {
mHashMap= new HashMap<String, Object>();
mHashMap.put( "content" , "This is ---> " +i);
mArrayList.add(mHashMap);
}
}
private class ItemClickListenerImpl implements OnItemClickListener {
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long arg) {
System.out.println( "OnItemClickListener position=" +position);
}
}
} |
ListViewAdapter如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
package cc.testlistview;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ListViewAdapter extends BaseAdapter {
private List<? extends Map<String, ?>> mArrayList;
private int resource;
private LayoutInflater mLayoutInflater;
private final int TYPE_COUNT= 2 ;
private final int FIRST_TYPE= 0 ;
private final int OTHERS_TYPE= 1 ;
private int currentType;
public ListViewAdapter(Context context,List<? extends Map<String, ?>> data, int resource, String[] from, int [] to) {
this .mArrayList=data;
this .resource=resource;
mLayoutInflater=(LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
}
@Override public int getCount() {
if (mArrayList== null ) {
return 0 ;
} else {
return (mArrayList.size()+ 1 );
}
}
@Override public Object getItem( int position) {
if (mArrayList== null ) {
return null ;
} else {
if (position> 0 ) {
return mArrayList.get(position- 1 );
} else {
return mArrayList.get(position+ 1 );
}
}
}
@Override public long getItemId( int position) {
return position;
}
///////////////////////////////////////////////////////
@Override public int getViewTypeCount() {
return TYPE_COUNT;
}
@Override public int getItemViewType( int position) {
if (position== 0 ) {
return FIRST_TYPE;
} else {
return OTHERS_TYPE;
}
}
///////////////////////////////////////////////////////
@Override public View getView( int position, View convertView, ViewGroup parent) {
View firstItemView = null ;
View othersItemView= null ;
//获取到当前位置所对应的Type
currentType= getItemViewType(position);
System.out.println( "type=" +currentType);
if (currentType== FIRST_TYPE) {
firstItemView = convertView;
FirstItemViewHolder firstItemViewHolder= null ;
if (firstItemView== null ) {
System.out.println( "firstItemView==null " );
firstItemView = mLayoutInflater.inflate(R.layout.firstitem, null );
firstItemView.setOnClickListener( new OnClickListener() {
@Override public void onClick(View view) {
System.out.println( "=====click first item=======" );
}
});
firstItemViewHolder= new FirstItemViewHolder();
firstItemViewHolder.imageView=(ImageView) firstItemView.findViewById(R.id.imageView);
firstItemView.setTag(firstItemViewHolder);
} else {
System.out.println( "firstItemView!=null " );
System.out.println( "111 getClass=" +firstItemView.getTag().getClass().toString());
firstItemViewHolder=(FirstItemViewHolder) firstItemView.getTag();
}
if (firstItemViewHolder.imageView!= null ) {
firstItemViewHolder.imageView.setImageResource(R.drawable.ic_launcher);
}
convertView=firstItemView;
} else {
othersItemView = convertView;
OthersViewHolder othersViewHolder= null ;
if (othersItemView== null ) {
System.out.println( "othersItemView==null " );
othersItemView = mLayoutInflater.inflate(R.layout.othersitem, null );
othersViewHolder= new OthersViewHolder();
othersViewHolder.textView=(TextView) othersItemView.findViewById(R.id.textView);
othersItemView.setTag(othersViewHolder);
} else {
System.out.println( "othersItemView!=null " );
System.out.println( "222 getClass=" +othersItemView.getTag().getClass().toString());
othersViewHolder=(OthersViewHolder) othersItemView.getTag();
}
if (mArrayList!= null ) {
if (othersViewHolder.textView!= null ) {
othersViewHolder.textView.setText((String)(mArrayList.get(position- 1 ).get( "content" )));
}
}
convertView=othersItemView;
}
return convertView;
}
//第一个Item的ViewHolder
private class FirstItemViewHolder{
ImageView imageView;
}
//除第一个Item以外其余Item的ViewHolder
private class OthersViewHolder{
TextView textView;
}
} |
相关推荐
android 的listview 内部item的布局包含checkbox控件简单好用!
本文实例讲述了Android编程...一开始想着是不是能在list item的布局给上层布局添加一个: android:clickable=false android:focusable=false 就是禁止点击,但试了试没有效果,后来师傅提醒我,我的这个listview使
在android的listview中的item显示不同的布局信息
模拟聊天界面的ListView中的两种布局的实现
解决Android的ListView里面多套item内含多个EditText数据混乱问题
Android中会有一个Listview对应多个Item的,例如:微信收藏、消息界面,都是ListView对应多个Item。这是一个demo,实现了一对多的适配。
Android中ListView的每个Item以资源文件XML形式显示数据进行布局
ListView对应多个布局的实现方式。ListView滚动中布局错误的解决方案,博客中对于的介绍博文
listview点击item显示adapter里的隐藏布局,点击令一个item,隐藏上一个item的隐藏布局
模拟聊天界面ListView中的两种item布局的实现
listview加载多种布局文件,代码中用了三个简单布局,其他数量可自行添加
http://blog.csdn.net/lv_fq/article/details/52976463
主要介绍了Android中ListView Item布局优化技巧,以实例形式分析了ListView Item布局的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
欢迎来下载RecyclerView实现复杂界面,本demo是由本人去多方百度参考后写成, 易于会ListView的小伙伴们理解,如demo有问题可以加QQ:731712249(加Q请说明来意),也可以加入Android交流群讨论:586620031
ListView中含有多个item布局的处理,在类似微信里chat界面的时候,会遇到一个listView中有多个布局存在的状况(普通聊天布局、纯图片布局、图文混排布局等等,提供一些解决方案。
从网络加载图片显示到...item布局是TextView和ImageView 数量的多少视情况而定 再写一个网络请求数据的类 最后面有代码: ”urlConnection 请求数据类的封装“ 类名一定要一样 封装数据类 还有别忘了依赖和权限
ListView中有一个属性:android:choiceMode,对应三个可选值: * singleChoice 单选 * multipleChoice 多选 ...在ListView的布局中设置了android:choiceMode属性后,item布局需要实现checkable,才有选中效果。
NULL 博文链接:https://trylovecatch.iteye.com/blog/1158065