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. Anacond win10安装与介绍

    Anacond的介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. 因为包含了大量的科学包,Anaconda 的下载文件比较大( ...

  2. Open quote is expected for attribute "{1}" associated with an element type "column".

    这个的错误的意思很简单:就是自己的配置文件是否缺少""号

  3. Python从入门到精通之eighth!

    函数式编程与内置函数 函数作用域: def test1(): print('in the test1') def test(): print('in the test') return test1() ...

  4. Unity中AB资源打包简单的脚本

    脚本应该放在Editor文件夹下 using System.Collections; using System.Collections.Generic; using UnityEngine; usin ...

  5. 学以致用三十四-----python2.0加载图片

    想用做一个静态图片为背景的页面.结果遇到了一些阻碍.其主要原因还是路径没有找对.网上也参考了不少方法,也许是因为版本不同,处理的方法也不同,因此按照网上的处理方式,也没有得到解决. 为此困惑了一天.结 ...

  6. java开发师笔试面试每日12题(2)

    1.Volatile和Synchronized不同点 (1).volatile只能作用于变量,使用范围较小.synchronized可以用在变量.方法.类.同步代码块等,使用范围比较广. (2).vo ...

  7. python中的三种输入方式

    python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...

  8. python for data analysis 2nd 读书笔记(一)

    第一章相对简单,也么有什么需要记录的内容,主要用到的工具的简介及环境配置,粗略的过一下就行了.下面我们开始第二章的学习 CHAPTER 22.2Python Language Basics, IPyt ...

  9. java(一) 基础部分

    1.11.简单讲一下java的跨平台原理 Java通过不同的系统.不同版本.不同位数的java虚拟机(jvm),来屏蔽不同的系统指令集差异而对外体统统一的接口(java API),对于我们普通的jav ...

  10. nodejs多版本管理

    nvm安装步骤: Windows版本安装 https://github.com/coreybutler/nvm-windows/releases 下载最新的setup文件 ,解压缩,安装到C:\Dev ...