首先,在Activity中写的数据(数组、链表、集合、数据库等)无法直接传递给ListView的,要将数据传递过去,需要借助适配器(Adapter)来完成。
这里讲得是ArrayAdapter这个适配器(数组适配器),这个适配器的数据源可以是集合或者数组。本人开始碰这个适配器的时候,结合视频和书看的,发现ArrayAdapter 有两个构造方法,书本上用的是三个参数的,视频上用的是四个参数的,当时就觉得混乱。上网搜索一下,看着别人说的不太适合自己的理解,所以这里写下自己的理解。
查阅资料后,经过整理,个人总结一下这两个构造方法的用法和区别。
ArrayAdapter的两个构造方法:
- public ArrayAdapter (Context context, int resource, int textViewResourceId, List objects)
- public ArrayAdapter (Context context, int resource, List objects)
其中 resource 是 layout,textViewResourceId 是 textview的id,list object 是要适配的数据。
区别在于,如果我自定义了TextView控件,则需要使用四个参数的 ArrayAdapter方法。
最后,还需要调用 ListView 的 setAdapter() 方法,将构建好的适配器对象传递进去,才算将 ListView 和数据关联好。
总结使用适配器的过程:
新建适配器——>添加数据源到适配器——>视图加载适配器
栗子:
- 三个参数的,直接用自带的 android.R.layout.simple_list_item_1
MainActivity.java
package com.example.jj.listview_arrayadapter_821;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<String> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找控件
ListView listView=(ListView) findViewById(R.id.listView);
//准备数据
initData();
//展示数据——数据适配器
//resource 资源文件————要展示的布局效果
//textViewResourceId textView 的id
//objects 集合或者数据
listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,dataList));
}
private void initData(){
dataList=new ArrayList<String>();
for(int i=0;i<20;i++){
dataList.add("我是第"+i+"条目");
}
}
}
- 使用四个参数的,自定义了TextView。
lv_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
MainActivity.java
package com.example.jj.listview_arrayadapter_821;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<String> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找控件
ListView listView=(ListView) findViewById(R.id.listView);
//准备数据
initData();
//展示数据——数据适配器
//resource 资源文件————要展示的布局效果
//textViewResourceId textView 的id
//objects 集合或者数据
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.lv_list,R.id.tv_title,dataList);
listView.setAdapter(adapter);
}
private void initData(){
dataList=new ArrayList<String>(); //创建ArrayList 动态数组 dataList
for(int i=0;i<20;i++){
dataList.add("我是第"+i+"条目");
}
}
}
上文有什么不对的,望各位大牛们不吝指出。
附上一篇关于 ArrayList 动态数组使用的博客。
http://www.cnblogs.com/rickie/articles/67978.html