LisView多布局展示
来源:互联网 发布:字体在mac上不可用 编辑:程序博客网 时间:2024/05/20 22:38
ListView是支持多种布局的,例如,新浪微博中布局就分很多种,有的布局有图片,有的只有文字等。
先看下效果:
两种布局类型:
adapter.xml:
adapter2.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns: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>
MainActivity.java:
ListViewItem.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
publicclassListViewItem{
privateStringmString;
//布局的类型
privateintmType;
publicListViewItem(){
}
publicListViewItem(Stringstring,inttype){
mString= string;
mType= type;
}
publicStringgetString(){
returnmString;
}
publicvoidsetString(Stringstring){
mString= string;
}
publicintgetType(){
returnmType;
}
publicvoidsetType(inttype){
mType= type;
}
}
不同的CustomAdapter.java的写法:
第一种:
CustomAdapter.java:
第二种:
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
packageinfo.dabu.multiplelayoutwithoutnoanotation;
import android.app.Activity;
importandroid.view.LayoutInflater;
import android.view.View;
importandroid.view.ViewGroup;
import android.widget.BaseAdapter;
importandroid.widget.ImageView;
import android.widget.TextView;
importjava.util.List;
/**
* Created by AlexY on 2016/4/1.
*
*
*
*/
public class CustomAdapterextendsBaseAdapter{
privateActivity mActivity;
privateList<ListViewItem> mList;
publicCustomAdapter(){
}
publicCustomAdapter(Activityactivity,List<ListViewItem>list){
mActivity= activity;
mList= list;
}
@Override
publicintgetCount(){
returnmList.size();
}
@Override
publicObjectgetItem(intposition){
returnmList.get(position);
}
@Override
publiclonggetItemId(intposition){
return0;
}
// 总共有几种布局
@Override
publicintgetViewTypeCount(){
return2;
}
// 获取Item的View的类型
@Override
publicintgetItemViewType(intposition){
return mList.get(position).getType();
}
@Override
publicView getView(intposition,View convertView,ViewGroup parent){
finalTextViewHolder textViewHolder;
finalImageViewHolder imageViewHolder;
//必须将要设置的控件单独提取出来
TextViewtextView= null;
ImageViewimageView= null;
if( convertView== null){
switch(getItemViewType(position)){
case0:
convertView= LayoutInflater.from(mActivity).inflate(R.layout.type_textview,parent,false);
textViewHolder= new TextViewHolder();
textView= (TextView)convertView.findViewById(R.id.text);
textViewHolder.textview= textView;
convertView.setTag(textViewHolder);
break;
case1:
convertView= LayoutInflater.from(mActivity).inflate(R.layout.type_imageview,parent,false);
imageViewHolder= new ImageViewHolder();
imageView=(ImageView)convertView.findViewById(R.id.image);
imageViewHolder.imageView= imageView;
convertView.setTag(imageViewHolder);
break;
default:
break;
}
}else{
switch( getItemViewType(position)){
case0:
textViewHolder= (TextViewHolder)convertView.getTag();
textView= textViewHolder.textview;
break;
case1:
imageViewHolder= (ImageViewHolder)convertView.getTag();
imageView= imageViewHolder.imageView;
break;
}
}
switch(getItemViewType(position)){
case0:
//虽然textview不会为null,但检查下还是必要的
if( null != textView){
textView.setText(mList.get(position).getString());
}
break;
case1:
//虽然imageView不会为null,但检查下还是必要的
if( null != imageView){
imageView.setImageResource(R.mipmap.bangalore);
}
break;
}
returnconvertView;
}
//用来优化含TextView的布局
publicclassTextViewHolder{
TextView textview;
}
// 用来优化含ImageView的布局
publicclassImageViewHolder{
ImageViewimageView;
}
}
剩下的问题:
上面两种虽然可以实现功能,但是有个问题,上面中才两种布局,如果有5种布局,则CustomAdapter.java中代码就很长了。所以我们需要将getView()中的代码拆解到多个文件中。
第三种写法:
先定义一个接口DelegateAdapter,这个接口有个方法专门用来返回不同的布局:
DelegateAdapter.java:
然后有几个布局,就写个类来实现接口DelegateAdapter:
TextDelegateAdapter.java:
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
packageinfo.dabu.multiplelayoutwithoutnoanotation.Adapter;
importandroid.view.LayoutInflater;
import android.view.View;
importandroid.view.ViewGroup;
import android.widget.TextView;
import info.dabu.multiplelayoutwithoutnoanotation.DelegateAdapter;
importinfo.dabu.multiplelayoutwithoutnoanotation.ListViewItem;
import info.dabu.multiplelayoutwithoutnoanotation.R;
/**
* 含TextView的
*/
publicclassTextDelegateAdapterimplementsDelegateAdapter{
@Override
publicView getView(intposition,View convertView,ViewGroup parent,LayoutInflater inflater,Objectitem){
final TextViewHoldertextViewHolder;
if( convertView== null){
convertView= inflater.inflate(R.layout.type_textview,parent,false);
textViewHolder= new TextViewHolder();
textViewHolder.textview= (TextView)convertView.findViewById(R.id.text);
convertView.setTag(textViewHolder);
}else{
textViewHolder= (TextViewHolder)convertView.getTag();
}
if( null != textViewHolder.textview){
textViewHolder.textview.setText(( (ListViewItem)item).getString());
}
return convertView;
}
//用来优化含TextView的布局
publicclassTextViewHolder{
TextViewtextview;
}
}
ImageDelegateAdapter.java:
现在的CustomAdapter.java比上面两种写法要简洁和干净些。
CustomAdapter.java:
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
packageinfo.dabu.multiplelayoutwithoutnoanotation;
importandroid.app.Activity;
import android.support.v4.util.LongSparseArray;
importandroid.view.LayoutInflater;
import android.view.View;
importandroid.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.List;
import info.dabu.multiplelayoutwithoutnoanotation.Adapter.ImageDelegateAdapter;
importinfo.dabu.multiplelayoutwithoutnoanotation.Adapter.TextDelegateAdapter;
/**
* Created by AlexY on 2016/4/1.
*
*
*
*/
publicclassCustomAdapterextendsBaseAdapter{
privateLongSparseArray<DelegateAdapter>mDelegateAdapterSparseArray;
privateActivity mActivity;
privateList<ListViewItem> mList;
privateLayoutInflater mLayoutInflater;
publicCustomAdapter(){
}
publicCustomAdapter(Activityactivity,List<ListViewItem>list){
mActivity= activity;
mList= list;
mLayoutInflater= LayoutInflater.from(mActivity);
mDelegateAdapterSparseArray= new LongSparseArray<>();
DelegateAdapterdelegateAdapter0= newTextDelegateAdapter();
mDelegateAdapterSparseArray.put(0,delegateAdapter0);
DelegateAdapterdelegateAdapter1= newImageDelegateAdapter();
mDelegateAdapterSparseArray.put(1,delegateAdapter1);
}
@Override
publicintgetCount(){
returnmList.size();
}
@Override
publicObjectgetItem(intposition){
returnmList.get(position);
}
@Override
publiclonggetItemId(intposition){
return0;
}
// 总共有几种布局
@Override
publicintgetViewTypeCount(){
returnmDelegateAdapterSparseArray.size();
}
// 获取Item的View的类型
@Override
publicintgetItemViewType(intposition){
return mList.get(position).getType();
}
@Override
publicView getView(intposition,View convertView,ViewGroup parent){
intitemType= getItemViewType(position);
switch(itemType){
case0:
return mDelegateAdapterSparseArray.get(itemType).getView(position,convertView,parent,mLayoutInflater,getItem(position));
case1:
returnmDelegateAdapterSparseArray.get(itemType).getView(position,convertView,parent,mLayoutInflater,getItem(position));
default:
break;
}
returnconvertView;
}
}
其余的MainActivity.java和布局文件都和上面一样。
0 0
- LisView多布局展示
- 使用Lisview多布局时报数组越界 异常java.lang.ArrayIndexOutOfBoundsException
- ListView多布局展示
- ListView多布局展示bug
- RecyclerView多布局展示示例
- Dialog自定义布局展示
- BorderLayout布局展示
- RecyclerView展示多种布局
- 抽屉布局+PullToRefreshListView展示
- 多条目展示ListView(如:有两种不同的布局图片在listview条目上展示)
- ListView多布局展示 异常 数组下标越界
- pullToRefreshView 加载多布局展示 数组下标越界(ListView相同)
- 实现书架展示排列布局
- ListView展示两种布局
- iOS- 快速实现展示布局
- Lisview index异常
- LisView设置 上下文菜单
- lisView优化(2)
- 对JavaEE基础多线程基础的理解
- 练习17.21 使用本节中定义的valid函数重写8.3.2节(第289页)中的电话号码程序。
- WF公务车新需求开发(再续)
- MQTT协议理解和翻译计划
- select根据text默认选中
- LisView多布局展示
- 谈谈主函数main
- Java8 Stream语法详解 不用循环
- Hector—slam源码分析(转)
- 计算相似度的方法
- linux redis安装
- 遍历
- VR开发资源汇总
- 第八周(Dynamic ProgrammingII)