好久没更主要原因是在这般遇到了点困难,一直没理解,最近理解了一点就来写一下。
首先了解一下它的继承关系,如下图:
可以看到它继承于AdapterView,AdapterView也是一个重要的组件,本身是一个抽象类,又继承于ViewGroup,所以其本质是容器,AdapterView可以包括多个“列表项”,显示的多个“列表项”由Adapter(适配器)提供,其派生的子类即今天重点描述的ListView也有此特征。
ListView是手机应用中使用很广的一个控件,它会以垂直列表的形式显示所有的列表项。首先需要在布局文件中定义,如下:
<ListView
android:id="@+id/list_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="@color/colorAccent"
android:dividerHeight="3dp"/>
注:
android:divider属性:设置list列表项的分隔条
android:dividerHeight:设置分隔条的高度
因为我们定义的数组的数据无法直接传递给ListView,想要显示列表项就要通过Adapter来实现了,Adapter是一个接口,今天要用的只是它的三个实现类,这三个Adapter的实现类都可以为ListView填充数据:
①ArrayAdapter:简单易用的Adapter,可以通过泛型指点要适配的数据类型,通常用到的情况都只是包含文本信息。其实现的代码如下:
public class ArrayActivity extends AppCompatActivity {
private ListView mListView;
private ArrayList list ;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_array);
mListView = (ListView) findViewById(R.id.list_view);
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
String str = "第"+i+"条数据";
list.add(str);
}
//设置ArrayAdapter设配器,传递的三个参数是:①Context:访问应用的接口 ②resource:一个布局的资源ID文件(这边用的是系统自带的布局) ③list:负责为多个列表项提供数据
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line, list);
mListView.setAdapter(adapter);
}
}
效果图如下:
②SimpleAdapter:比ArrayAdapter复杂,但是功能强大,可将List的多个对象包装成列表项,具体在代码中理解:
public class SimpleActivity extends AppCompatActivity{
private ListView mListView;
private List
效果图如下:
③BaseAdapter:通常用于被拓展,也就是自定义的Adapter,灵活性最强,也最常用。需要重写四个方法:getCount()、getItem()、getItemId()和getView()。
int getCount():返回填充的数据项的个数,必须返回真实值
Object getItem(int position):根据position返回某一项数据
long getItemId(int position):根据position返回某一项的行ID
View getView(int position, View convertView, ViewGroup parent):根据position返回某一项的界面View,显示给用户
代码如下:
先写一个MyAdapter类继承于BaseAdapter:
public class MyAdapter extends BaseAdapter{
private Context mContext;
private ArrayList list;
private ArrayList list1;
public MyAdapter(ArrayList list, Context mContext,ArrayList list1) {
this.list = list;
this.mContext = mContext;
this.list1 = list1;
}
// private LayoutInflater mLayoutInflater;//加载自定义布局
@Override
public int getCount() {
return list.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 parent) {
//使用布局填充器进行布局
convertView = LayoutInflater.from((Context) mContext).inflate(R.layout.custom,null);
//获得布局中的子控件
ImageView image = (ImageView) convertView.findViewById(R.id.image_custom);
image.setImageResource(R.mipmap.header_1);
TextView textView = (TextView) convertView.findViewById(R.id.text_custom);
//给textView 中传内容
textView.setText(list.get(position));
TextView textView1 = (TextView) convertView.findViewById(R.id.text_custom1);
textView1.setText(list1.get(position));
return convertView;
}
}
然后实现适配Adapter显示列表项:
public class BaseActivity extends AppCompatActivity {
private ListView mListView;
private ArrayList list;
private ArrayList list1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
mListView = (ListView) findViewById(R.id.list_base);
//数据初始化
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
String str = "第"+i+"条数据";
list.add(str);
}
list1 = new ArrayList<>();
for (int i = 0; i < 20; i++) {
String str = i+"条内容";
list1.add(str);
}
MyAdapter myAdapter = new MyAdapter(list, this,list1);
mListView.setAdapter(myAdapter);
}
}