安卓Listview和Adapter数据设计

时间:2022-04-25 07:02:28

ListView是一种用于垂直显示的列表控件,如果显示内容过多,则会自动出现垂直滚动条,每一行是一个View对象,在每一行上可以放置任何组件,Adapter适配器是数据和UI的桥梁,为数据显示提供了统一的封装。

常用的Adapter有:

ArrayAdapter<T>:用来绑定一个数组,支持泛型操作,最为简单,只能展示一行字。

SimpleAdapter:用来绑定在布局xml中定义的控件对应的数据,有好的扩充性,可以自定义出各种效果

BaseAdapter:是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性

ArrayAdapter的使用:

该类的构造方法为:public ArrayAdapter(Context context, int textViewResourceId, List<T> objects)其中参数1为上下文;参数2为布局文件,通常使用系统提供的单文字布局(android.R.layout.simple_list_item_1);参数3为数据,通常为List集合或者数组。

1、简单的一个列表实现:

安卓Listview和Adapter数据设计

布局文件:

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

数据添加和适配:

      //新建一个list存放数据
List<String> listdata=new ArrayList<String>();
listdata.add("东小东1");
listdata.add("东小东2");
listdata.add("东小东3");
listdata.add("叮叮当当");
listdata.add("咚咚咚嘻嘻嘻"); //列表
main_list=(ListView)findViewById(R.id.main_list);
//android.R.layout.simple_list_item_1不可改成自定义布局文件
final ArrayAdapter<String> adp2=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,listdata);
main_list.setAdapter(adp2);

listview的事件监听:

    //点击事件
main_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this,"你点击了:"+position+"项 内容为:"+adp2.getItem(position),Toast.LENGTH_SHORT).show(); }
}); //长按事件
main_list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this,"你长按了:"+position+"项 内容为:"+adp2.getItem(position),Toast.LENGTH_SHORT).show(); return true;
}
});

2、下拉选择栏实现和输入匹配:

安卓Listview和Adapter数据设计                             安卓Listview和Adapter数据设计

布局文件:

 <Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_spinner"
> </Spinner> <!--completionThreshold="1" 表示从第一个字符开始匹配 -->
<AutoCompleteTextView
android:id="@+id/main_autotv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="在这里输入会自动提示"
android:completionThreshold="1" /> <Button
android:layout_width="match_parent"
android:text="点.."
android:id="@+id/main_but"
android:layout_height="wrap_content" /> <TextView
android:layout_width="wrap_content"
android:text="请点击按钮"
android:id="@+id/main_tv"
android:layout_gravity="center"
android:layout_height="wrap_content" />

简单逻辑实现:

 /配置一个公用的数组做测试
//arrayadapter实现字符串适配
String[] str_arr={"东小东","东东","大东东","叮叮当当"}; //选择框
main_sp=(Spinner)findViewById(R.id.main_spinner);
ArrayAdapter<String> adp=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_spinner_item,str_arr);
adp.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
main_sp.setAdapter(adp); //输入提示
main_atv=(AutoCompleteTextView)findViewById(R.id.main_autotv);
ArrayAdapter<String> adp2=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,str_arr);
main_atv.setAdapter(adp2); //按钮监听,获取两个框的值
findViewById(R.id.main_but).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String strsp=main_sp.getSelectedItem().toString().trim();
String stratv=main_atv.getText().toString().trim();
main_tv.setText(strsp+"\n"+stratv); }
});

SimpleAdapter的使用:

该类的构造方法为:public SimpleAdapter(Context context, List<? Extends Map<String, ?>> data, int resource, String[] from, int[] to)其中参数1为上下文;参数2为数据,一个Map的list,List里每一项都是map对象,一个map对象就表示listview中一行的内容;参数3为布布局资源,可以知己写也可以使用系统提供的;参数4为map里的键,其对应着参数5中布局资源的每一个显示控件id。

安卓Listview和Adapter数据设计

建立listview中每一个item的基本布局:

新建一个xml文件即可

安卓Listview和Adapter数据设计

主布局文件:

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

数据设置和适配及listview事件监听:

 String str_con="一秒就成为了下一秒的过去,既然很多东西注定要失去的,那么,我们唯一可以做到的就是不轻易忘记。“读过一句话,当你总是缅怀过去的时候,证明你现在过的并不好。所以,美好的回忆可以,但绝不留恋。要永远憧憬,永远在现在努力。";

 //新建一个list存放数据
List<Map<String,Object>> listdata=new ArrayList<Map<String,Object>>(); //第一行内容
Map<String,Object> mapdata=new HashMap<String, Object>();
mapdata.put("img",R.mipmap.zcy1);
mapdata.put("title","东小东1");
mapdata.put("context","1: "+str_con);
listdata.add(mapdata); //第二行内容
mapdata=new HashMap<String, Object>();
mapdata.put("img",R.mipmap.zcy2);
mapdata.put("title","东小东2");
mapdata.put("context","2: "+str_con);
listdata.add(mapdata); //第三行内容
mapdata=new HashMap<String, Object>();
mapdata.put("img",R.mipmap.zcy3);
mapdata.put("title","东小东3");
mapdata.put("context","3: "+str_con);
listdata.add(mapdata); //键和显示控件的id必须一一对应
String[] key_data={"img","title","context"};
int[] res_data={R.id.dong_img,R.id.dong_title,R.id.dong_context}; //列表
main_list=(ListView)findViewById(R.id.main_list);
final SimpleAdapter adp2=new SimpleAdapter(MainActivity.this,listdata,R.layout.dong,key_data,res_data);
main_list.setAdapter(adp2); //长按事件
main_list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { //方法1------------------------------
// Map<String, Object> mMap = (Map<String, Object>) adp2.getItem(position); //得到标题
// String title=mMap.get("title").toString();
//得到内容
// String cont=mMap.get("context").toString(); //得到图片资源
// int img=(int)mMap.get("img"); //方法2-----------------------------
HashMap<String,String> map=(HashMap<String,String>)parent.getItemAtPosition(position);
//得到标题
String title=map.get("title");
//得到内容
String cont=map.get("context"); Toast.makeText(MainActivity.this,"\n你长按了第:"+position+"项\n标题为:"+title+"\n内容为:"+cont,Toast.LENGTH_SHORT).show(); return true;
}
});

BaseAdapt使用:

相比前面两个,其baseadapt使用较为复杂,但实现的功能较多,对复杂界面数据显示能力强,是学习listview数据适配的重点。baseadapt是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性。

安卓Listview和Adapter数据设计

建立listview中每一个item的基本布局:

新建一个xml文件即可

安卓Listview和Adapter数据设计

建立一个存放数据的类,并实现其Get和Set方法:

 class BaseData{
//分别为标题和内容
private String title,text;
//图片资源
private int img; public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getText() {
return text;
} public void setText(String text) {
this.text = text;
} public int getImg() {
return img;
} public void setImg(int img) {
this.img = img;
}
}

设置数据:

 String str_con="一秒就成为了下一秒的过去,既然很多东西注定要失去的,那么,我们唯一可以做到的就是不轻易忘记。“读过一句话,当你总是缅怀过去的时候,证明你现在过的并不好。所以,美好的回忆可以,但绝不留恋。要永远憧憬,永远在现在努力。";

 List<BaseData> listdatax=new ArrayList<>();
BaseData bd=new BaseData();
bd.setImg(R.mipmap.zcy1);
bd.setTitle("东小东111");
bd.setText("111"+str_con);
listdatax.add(bd); bd=new BaseData();
bd.setImg(R.mipmap.zcy2);
bd.setTitle("东小东222");
bd.setText("222"+str_con);
listdatax.add(bd); bd=new BaseData();
bd.setImg(R.mipmap.zcy3);
bd.setTitle("东小东333");
bd.setText("333"+str_con);
listdatax.add(bd);

 viewholder缓存设计:

通过ViewHolder缓存convertView,这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能 。 ViewHolder只是将需要缓存的那些view封装好。

 private static class  mViewHolder{
TextView htext,htitle;
ImageView himg; }

适配器类:

 //适配器类
public class MyBaseAdapter extends BaseAdapter { private List<BaseData> listdatax2;
//构造函数,获取到数据列表
public MyBaseAdapter(List<BaseData> datex){
this.listdatax2=datex;
} @Override
public int getCount() {//总条数
return listdatax2.size();
}
@Override
public Object getItem(int position) {//根据一个索引(位置)获得该位置的对象
return listdatax2.get(position);
}
@Override
public long getItemId(int position) {//获取条目的id
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {//获取该条目要显示的界面
mViewHolder holder = null; if (convertView == null) {
//无缓存时进入
holder = new mViewHolder();
//这里要注意有一个是上下文,一个是显示每一行的行布局文件
convertView=MainActivity.this.getLayoutInflater().inflate(R.layout.dong,parent,false); holder.htitle = (TextView) convertView.findViewById(R.id.dong_title);
holder.htext= (TextView) convertView.findViewById(R.id.dong_context);
holder.himg = (ImageView) convertView.findViewById(R.id.dong_img);
convertView.setTag(holder);
}else {
//缓存时进入
holder = (mViewHolder) convertView.getTag();
}
//匹配数据
holder.htitle.setText(listdatax2.get(position).getTitle());
holder.htext.setText(listdatax2.get(position).getText());
holder.himg.setImageResource(listdatax2.get(position).getImg()); /*
lilayoutx.p1tx.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
iteminterx.onclick(position);
}
}); */
return convertView;
}
}

结果显示及事件监听:

 //新建适配器对象
final MyBaseAdapter myadapterx=new MyBaseAdapter(listdatax);
//列表
main_list=(ListView)findViewById(R.id.main_list);
//设置适配器
main_list.setAdapter(myadapterx);
//添加点击事件
main_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//使用对象方法获取
BaseData itemx;
itemx = (BaseData) myadapterx.getItem(position);
int img=itemx.getImg(); //可自接通过此处改变控件上的某个图片显示
//图片显示控件,main_img=(ImageView)findViewById(R.id.main_img);
main_img.setImageResource(img); //数据输出
Toast.makeText(MainActivity.this,position + " *** " + itemx.getTitle() + " " + img,Toast.LENGTH_SHORT).show();
}
});

下一步将整理出基本的详细内容展示页编写和ListView下拉刷新实现