0%

Android-ListView

Android-ListView


ListView低配版

首先通过一个简化版的ListView来了解一下ListView的使用大体步骤

一. 编写activity_list_view.xml 代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ListViewActivity">

<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content">

</ListView>
</LinearLayout>

二. 编写单个的item的布局文件item_listview.xml,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
android:id="@+id/iv_pic"
android:src="@drawable/smile"
android:layout_width="50dp"
android:layout_height="50dp" />

<TextView
android:gravity="center_vertical"
android:id="@+id/tv_name"
android:text="名字"
android:layout_width="match_parent"
android:layout_height="50dp" />
</LinearLayout>

三. 自定义一个适配器,继承自BaseAdapter

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
public class MyAdapter extends BaseAdapter {
private LayoutInflater layoutInflater;
private Context context;

/**
* 构造函数,传入上下文Context
* @param context
*/
public MyAdapter(Context context) {
this.context=context;
layoutInflater=LayoutInflater.from(context);
}

/**
* 返回数据集合的长度
* @return
*/
@Override
public int getCount() {
return 15;//此处暂用定值,实际开发时需要用相应集合的长度
}

@Override
public Object getItem(int i) {
return null;
}

@Override
public long getItemId(int i) {
return 0;
}

//这个ViewHolder只能服务于当前这个特定的adapter,因为ViewHolder里会指定item的控件,不同的ListView,item可能不同,所以ViewHolder写成一个私有的类
private class ViewHolder{
public TextView textView;
public ImageView imageView;
}

/**
* 重点,需要为它编写一个ViewHolder
* @param i
* @param view
* @param viewGroup
* @return
*/
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder=null;
if(holder==null)
{
view=layoutInflater.inflate(R.layout.item_listview,null);
holder=new ViewHolder();
holder.textView=view.findViewById(R.id.tv_name);
holder.imageView=view.findViewById(R.id.iv_pic);

view.setTag(holder);
}else{
holder= (ViewHolder) view.getTag();
}

holder.textView.setText("name");
holder.imageView.setImageResource(R.drawable.smile);

return view;
}
}

四. 在MainActivity.java中使用适配器

1
2
3
4
5
6
7
8
9
10
11
public class ListViewActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);

listView = findViewById(R.id.lv);
listView.setAdapter(new MyAdapter(this));
}
}

ListView中配版

很显然,我们使用ListView肯定不可能仅仅只是用来做这样固定的静态页面,所以我们当我们需要做一个动态的,可以从外部改变的ListView时,就需要用一下的方法了。

一. 编写activity_list_view.xml 代码和上面一样 二. 编写单个的item的布局文件item_listview.xml,代码和上面一样 三. 定义一个JavaBean,实现数据的改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Bean{
private String name;
private int id;
public Bean(String name, int id) {
this.name = name;
this.id = id;
}
public int getId() {
return id;
}
public String getName() {
return name;
}

public void setId(int id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}
}

四. 自定义一个适配器,继承自BaseAdapter,代码稍有改动

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
public class ComplexMyAdapter extends BaseAdapter {
private LayoutInflater layoutInflater;
private Context context;
private List<Bean> mDatas;//存放数据
/**
* 构造函数,传入上下文Context
* @param context
*/
public ComplexMyAdapter(Context context,List mDatas) {
this.context=context;
this.mDatas = mDatas;
layoutInflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
return mDatas.size();
}

@Override
public Object getItem(int i) {
return mDatas.get(i);
}

@Override
public long getItemId(int i) {
return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ComplexMyAdapter.ViewHolder holder = null;
if (holder == null) {
view = layoutInflater.inflate(R.layout.item_listview, null);
holder = new ComplexMyAdapter.ViewHolder();
holder.tvName = view.findViewById(R.id.tv_name);
holder.ivPic = view.findViewById(R.id.iv_pic);

view.setTag(holder);
} else {
holder = (ComplexMyAdapter.ViewHolder) view.getTag();
}
Bean b = mDatas.get(i);
holder.tvName.setText(b.getName());
holder.ivPic.setImageResource(b.getId());

return view;
}
private class ViewHolder{
ImageView ivPic;
TextView tvName;
}
}

五. 在MainActivity.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
public class ListViewActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);

listView = findViewById(R.id.lv);
listView.setAdapter(new MyAdapter(this));
initData();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(ListViewActivity.this,"点击了"+i,Toast.LENGTH_SHORT).show();
}
});
}
private void initData(){
List<Bean> mDatas = new ArrayList<>();
Bean b = new Bean("list0",R.drawable.smile);
mDatas.add(b);
for(int i=1;i<18;i++){
mDatas.add(new Bean("list"+i,R.drawable.smile));
}
//为数据绑定适配器
ComplexMyAdapter a = new ComplexMyAdapter(this,mDatas);
listView.setAdapter(a);
}
}

ListView高配版

除了上述以外,还有高配版,就是打造万能适配器,具体有兴趣可自学,暂时不作要求。