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
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、下拉选择栏实现和输入匹配:

                             

布局文件:

 <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中每一个item的基本布局:

新建一个xml文件即可

主布局文件:

 <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中每一个item的基本布局:

新建一个xml文件即可

建立一个存放数据的类,并实现其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下拉刷新实现

安卓Listview和Adapter数据设计的更多相关文章

  1. ListView和Adapter数据适配器的简单介绍

    ListView 显示大量相同格式数据 常用属性: listSelector            listView每项在选中.按下等不同状态时的Drawable divider            ...

  2. ListView和Adapter的配合使用以及Adapter的重写

    ListView和Adapter的使用   首先介绍一下ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组成: ...

  3. C#中清空ListView中的数据

    我的显示数据的方式通过button按钮点击事件,当点击之后查询数据库库并将数据显示出来. 代码如下: private void button6_Click(object sender, EventAr ...

  4. Android listview与adapter用法

    listview与adapter用法 博客分类: android   一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView ...

  5. ListView 和 Adapter用法

    一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常 ...

  6. android中listview分页载入数据

    前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方 ...

  7. android 开发之 ListView 与Adapter 应用实践

    在开发android中,ListView 的应用显得非常频繁,只要需要显示列表展示的应用,可以说是必不可少,下面是记录开发中应用到ListView与Adapter 使用的实例: ListView 所在 ...

  8. [Android] Android RecycleView和ListView 自定义Adapter封装类

    在网上查看了很多对应 Android RecycleView和ListView 自定义Adapter封装类 的文章,主要存在几个问题: 一).网上代码一大抄,复制来复制去,大部分都运行不起来,或者 格 ...

  9. Adapter数据变化改变现有View的实现原理及案例

    首先说说Adapter详细的类的继承关系.例如以下图 Adapte为接口它的实现类的对象作为AdapterView和View的桥梁,Adapter是装载了View(比方ListView和girdVie ...

随机推荐

  1. strncpy

    char* mstrncpy(char *dest, const char *src, size_t n){ size_t i; size_t j=n-; ; i < j && ...

  2. union: git command

    # switch one tag # warning: if do that, can't commit any change git clone $project_path git checkout ...

  3. 区域检测算法-MSERs

    区域检测算法-MSERs:最大稳定极值区域 参考书籍——<图像局部不变性特征与描述>王永明.王贵锦著 MSER最大极值稳定区域的提取步骤:1.像素点排序   2.极值区域生成   3.稳定 ...

  4. linux系统下部署DNS正向解析

    DNS服务概述: DNS(Domain Name System)域名系统,能够提供域名与IP地址的解析服务. 正向解析 正向解析是指域名到IP 地址的解析过程. 部署DNS正向解析 DNS服务的三个配 ...

  5. 关于阿里云ECS服务器修改远程端口的一点总结

    般修改公司的远程服务器的登录端口号分为两大步: 一.修改注册表中的两个地方的端口号:(注册表打开命令:regedit) [HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro ...

  6. 作业 -- 几道简单的Python题

    1.编写程序,要求生成10240个随机[0,512)之间的整数,并统计每个元素出现的次数. 2.编写程序,要求当用户输入一个列表和两个整数作为下标时,程序可以使用切片获取并输出列表中截取两个下标之间的 ...

  7. 索引Log

    最左前缀原则 B+ 主键索引ID =>ID树 非主键索引K 先K树=>ID树 主键自增索引

  8. cordova 问题汇总

    用chrome进行调试: https://jingyan.baidu.com/album/db55b609fde96d4ba30a2fa9.html?picindex=8 http://rensann ...

  9. Spring——事务

    Spring事务 事务的ACID特性 原子性(Atomicity):在事务中的操作,要么都执行,要么都不执行! 一致性(Consistency):数据从一种状态,同时到达另一种状态. 持久性(Dura ...

  10. 判断Array/Object

    Object.prototype.isPrototypeOf()  /  Array.prototype.isPrototypeOf()if(typeof items === "object ...