首页 > 技术 > 学习笔记 > Android学习笔记——listview和自定义adapter
2017
03-24

Android学习笔记——listview和自定义adapter

自定义adapter是listview中使用最多的一个Adapter适配器,因为它可以自定义listview的布局样式。在学习和查找资料以后,我也自己写了一个自定义adapter的Demo,下面通过我的Demo来了解一下如何写一个自定义Adapter。

1. 定义数据Model

创建一个测试用类

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
public class ArrayTest {
public ArrayTest(String topic, String time,int picture){
this.topic = topic;
this.time = time;
this.picture = picture;
}
private int picture;
private String topic;
private String time;
public int getPicture(){
return picture;
}
public void setPicture(int picture){
this.picture = picture;
}
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}

2. 定义布局样式

我自己做的布局样式是这样的:
Android学习笔记——listview和自定义adapter - 第1张  | Qlog
以下是代码:

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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.xyzardq.appfortest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/topic"
android:text="Topic"
android:textSize="30dp"
/>
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/topic"
android:text="12:00" />
<ImageView
android:id="@+id/picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/topic" />
</RelativeLayout>

3. 自定义Adapter

创建一个类继承BaseAdapter,复写BaseAdapter中的四个方法

  • public int getCount():
      是用来返回数据的数量的。
      
  • public Object getItem(int position):
      该方法使用来获得每一条ListView中的Item的,这里我们返回position即可,position是指每条Item在ListView中的位置(0, 1, 2……)。
      
  • public long getItemId(int position):
       该方法是来获得ListView中每条Item的Id的,这里我们依然返回position即可。
  • public View getView(int position, View convertview, ViewGroup viewGroup):
      该方法是自定义Adapter最重要的方法,在这个方法中我们需要将数据一一对应的映射或者添加到我们自己定义的View中。然后返回view。
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
public class ArrayTestAdapter extends BaseAdapter {
private List<ArrayTest> mData;//定义数据。
private LayoutInflater mInflater;//定义Inflater,加载我们自定义的布局。
/*
定义构造器,在Activity创建对象Adapter的时候将数据data和Inflater传入自定义的Adapter中进行处理。
*/
public ArrayTestAdapter(LayoutInflater inflater,List<ArrayTest> data){
mInflater = inflater;
mData = data;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertview, ViewGroup viewGroup) {
//获得ListView中的view
View viewArrayTest = mInflater.inflate(R.layout.main_item,null);
//获得布局对象
ArrayTest arrayTest = mData.get(position);
//获得自定义布局中每一个控件的对象。
TextView name = (TextView) viewArrayTest.findViewById(R.id.topic);
TextView age = (TextView) viewArrayTest.findViewById(R.id.time);
ImageView picture = (ImageView) viewArrayTest.findViewById(R.id.picture);
//将数据一一添加到自定义的布局中。
name.setText(arrayTest.getTopic());
age.setText(arrayTest.getTime());
picture.setBackgroundResource(arrayTest.getPicture());
return viewArrayTest ;
}
}

4. 加载自定义Adapter到Listview中

在onCreate函数中定义并加载listview对象,将自定义Adapter添加进去,并添加数据

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
public class MainActivity extends AppCompatActivity {
//定义数据
private List<ArrayTest> mData;
//定义ListView对象
private ListView ListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//为ListView对象赋值
ListView = (ListView) findViewById(R.id.listview);
LayoutInflater inflater = getLayoutInflater();
//初始化数据
initData();
//创建自定义Adapter的对象
ArrayTestAdapter adapter = new ArrayTestAdapter(inflater, mData);
//将布局添加到ListView中
ListView.setAdapter(adapter);
}
/*
初始化数据
*/
private void initData() {
Date now = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String stime = dateFormat.format( now );
mData = new ArrayList<ArrayTest>();
ArrayTest test1 = new ArrayTest("哦哈哟", stime,R.mipmap.ic_launcher);
ArrayTest test2 = new ArrayTest("扣你鸡哇", stime,R.mipmap.ic_launcher);
ArrayTest test3 = new ArrayTest("哈喽", stime,R.mipmap.ic_launcher);
mData.add(test1);
mData.add(test2);
mData.add(test3);
}
}

最后的界面为:
Android学习笔记——listview和自定义adapter - 第2张  | Qlog

参考资料

Android疯狂讲义(第三版)
Android UI设计——ListView控件和自定义Adapter(四)

最后编辑:
作者:xyzardq
这个家伙有点懒,什么都没有写

留下一个回复

你的email不会被公开。