listview是android应用相当广的一个控件,系统为其自定了三种属性,但是这些属性在日常商业化的开户应用中,基本上不会用到,用到的基本都会是自定义适配器,以下就一个简单的实例介绍一下如何用listview实现适配器
1、定义适配器 activity, 假设命名为 item1.xml 文件代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@mipmap/ic_launcher"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/title"
android:layout_width="240dp"
android:layout_height="wrap_content"
android:text="title"/>
<TextView
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="info" />
</LinearLayout>
</LinearLayout>
2、为item定义对应的数据结构类,如下所示:
package test.com.listview;
/**
* Created by Administrator on 2017-10-26.
*
* 适配器内容格式定义
*/
public class Info {
int id;
String title;
String details;
int src;
public void setId(int id){
this.id = id;
}
public int getId(){
return this.id;
}
public void setTitle(String title){
this.title = title;
}
public String getTitle(){
return this.title;
}
public void setDetails(String detail){
this.details = detail;
}
public String getDetails(){
return this.details;
}
public void setSrc(int src){
this.src = src;
}
public int getSrc(){
return this.src;
}
}
以上数据结构非常简单,就是一个图片加一个标题, 一个信息描述
3、实现主代码
void testListView2(){
//构造测试数据
setInfo();
lv.setAdapter(new ListViewAdapter(mListInfo));
}
/**
* 构造测试数据
*/
public void setInfo(){
mListInfo.clear();
int i=0;
while(i<20){
Info information = new Info();
information.setId(1000+i);
information.setTitle("标题"+i);
information.setDetails("详细信息"+i);
information.setSrc(R.mipmap.ic_launcher);
mListInfo.add(information); //将新的info对象加入到信息列表中
i++;
}
}
注意要定义内部类:
/**
*
* 内部类
*/
public class ListViewAdapter extends BaseAdapter {
View[] itemViews;
/**
* 构造函数完成内部对像 itemViews的封装
* @param mlistInfo
*/
public ListViewAdapter(List<Info> mlistInfo) {
itemViews = new View[mlistInfo.size()];
Info tmp = null;
for(int i = 0; i < itemViews.length; i++){
tmp = (Info)mlistInfo.get(i);
itemViews[i] = makeItemView(tmp.getTitle(), tmp.getDetails(), tmp.getSrc());
}
}
/**
* 生成一个赋值的item
* @param title
* @param detail
* @param src
* @return
*/
private View makeItemView(String title, String detail, int src) {
//空上inflater是干啥用的,以及其inflate方法
LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 使用View的对象itemView与R.layout.item关联
View itemView = inflater.inflate(R.layout.item1, null);
// 通过findViewById()方法实例R.layout.item内各组件
TextView tvTitle = (TextView) itemView.findViewById(R.id.title);
tvTitle.setText(title); //填入相应的值
TextView tvDetail = (TextView) itemView.findViewById(R.id.info);
tvDetail.setText(detail);
ImageView image = (ImageView) itemView.findViewById(R.id.img);
image.setImageResource(src);
return itemView;
}
@Override
public int getCount() {
return this.itemViews.length;
}
@Override
public Object getItem(int position) {
return this.itemViews[position];
}
@Override
public long getItemId(int position) {
//一般情况下 itemId与position相同
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
return itemViews[position];
}
return convertView;
}
} ;
运行即可发现,一个简单的listview适配器即完成,但是该类存在一个问题没有做分页,分页后续再介绍