Android学习笔记二十三之ListView列表视图一
来源:互联网 发布:java移上移下置顶 编辑:程序博客网 时间:2024/04/27 03:39
Android学习笔记二十三之ListView列表视图一
ListView列表视图是Android开发中最重要的组件之一,基本每一个APP都会用到ListView,不过现在Google推出一个新的组件,RecycleView,我们后面会介绍到。我们可以用ListView绘制出非常漂亮的列表。使用ListView绘制列表需要三个重要的元素:ListView、数据适配器Adapter、数据。ListView就是列表控件,数据就不用说了,下面我们介绍一下什么是Adapter?
什么是Adapter
我们首先看一下官方是怎么对Adapter定义的:
An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set.
简单翻译就是:Adapter对象是View和底层数据之间的桥梁,适配器给数据项提供访问接口,适配器还负责做一个视图中的每一项数据集。
Android提供德适配器有:ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, ThemedSpinnerAdapter, WrapperListAdapter。我们常用的有:ArrayAdapter、BaseAdapter、SimpleAdapter、SimpleCursorAdapter。
- BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性
- ArrayAdapter支持泛型操作,最为简单,只能展示一行字
- SimpleAdapter有最好的扩充性,可以自定义出各种效果
- SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
下面我们实现一个简单的例子,体会一下ListView和Adapter的结合:
ArrayAdapter,Activity代码:
private ListView lv_array_adapter;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_arrayadapter); lv_array_adapter = (ListView) findViewById(R.id.lv_array_adapter); final String[] names = getResources().getStringArray(R.array.adapter_name); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, names); lv_array_adapter.setAdapter(adapter); lv_array_adapter.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Toast.makeText(getApplicationContext(), "点击的是:" + names[i], Toast.LENGTH_SHORT).show(); } });}
布局代码比较简单,直接在布局中添加一个ListView组件。初始化中三个参数分别是:Context上下文对象,每一个Item的View,数据。
BaseAdapter:
Activity代码:
private ListView lv_base_adapter;private MYBaseAdapter adapter;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_baseadapter); lv_base_adapter= (ListView) findViewById(R.id.lv_base_adapter); final String[] datas=getResources().getStringArray(R.array.adapter_name); adapter=new MYBaseAdapter(this,datas); lv_base_adapter.setAdapter(adapter); lv_base_adapter.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Toast.makeText(getApplicationContext(),"点击的是:"+datas[i],Toast.LENGTH_SHORT).show(); } });}
自定义适配器代码:
package com.example.listviewdemo.adapter;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import com.example.listviewdemo.R;/** * Created by Devin on 2016/7/7. */public class MYBaseAdapter extends BaseAdapter {String[] datas;private Context context;public MYBaseAdapter(Context context, String[] datas) { this.datas = datas; this.context = context;}@Overridepublic int getCount() { return datas.length;}@Overridepublic Object getItem(int i) { return i;}@Overridepublic long getItemId(int i) { return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; if (view == null) { view = LayoutInflater.from(context).inflate(R.layout.item_base_adapter, null); viewHolder = new ViewHolder(); viewHolder.tv_base_adapter = (TextView) view.findViewById(R.id.tv_base_adapter); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } viewHolder.tv_base_adapter.setText(datas[i]); return view;}static class ViewHolder { TextView tv_base_adapter;}}
BaseAdapter是一个抽象类,继承于它就必须要实现四个方法:getCount()、getItem(int i)、getItemId(int i)、getView(int i, View view, ViewGroup viewGroup)。在这个四个方法中,getCount()是用来得到列表的长度,如果返回是0,那么列表就不显示item;getItem(int i)是用来得到item、getItemId(int i)是用来得到每一个item的标识;getView(int i, View view, ViewGroup viewGroup)用来绘制View。这里就简单的介绍而已。
simpleAdapter:
Activity代码:
package com.example.listviewdemo.activity;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import com.example.listviewdemo.R;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * Created by Devin on 2016/7/7. */public class SimpleAdapterActivity extends AppCompatActivity {private ListView lv_simple_adapter;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simpleadapter); lv_simple_adapter = (ListView) findViewById(R.id.lv_simple_adapter); final String[] names = getResources().getStringArray(R.array.adapter_name); final String[] says = getResources().getStringArray(R.array.name_says); List<Map<String, Object>> mapList = new ArrayList<>(); for (int i = 0; i < names.length; i++) { Map<String, Object> itemMap = new HashMap<>(); itemMap.put("names", names[i]); itemMap.put("says", says[i]); mapList.add(itemMap); } SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), mapList, R.layout.item_simple_adapter, new String[]{"names", "says"}, new int[]{R.id.tv_name, R.id.tv_says}); lv_simple_adapter.setAdapter(adapter); lv_simple_adapter.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Toast.makeText(getApplicationContext(), names[i] + "说了:" + says[i], Toast.LENGTH_SHORT).show(); } });}}
初始化的五个参数中,第一个是上下文对象,第二个是数据,第三个是Item的布局文件,第四个是数据的key,第五个是数据放置对应组件的id。
SimpleCursorAdapter:
Activity代码:
package com.example.listviewdemo.activity;import android.database.Cursor;import android.os.Bundle;import android.provider.ContactsContract;import android.support.annotation.Nullable;import android.support.v4.widget.SimpleCursorAdapter;import android.support.v7.app.AppCompatActivity;import android.widget.ListView;import com.example.listviewdemo.R;/** * Created by Devin on 2016/7/7. */public class SimpleCursorAdapterActivity extends AppCompatActivity {private ListView lv_simple_cursor_adapter;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simplecursoradapter); lv_simple_cursor_adapter = (ListView) findViewById(R.id.lv_simple_cursor_adapter); Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,R.layout.item_simple_cursor,cursor,new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER},new int[]{R.id.tv_con_name,R.id.tv_phone}); lv_simple_cursor_adapter.setAdapter(adapter);}}
比较简单,就不描述了。下面是实现的效果图:
这里只介绍简单的使用ListView和Adapter,下一节我们会介绍ListView的适配优化和其他问题。
猛戳下载源码
最后附上ListView的国内镜像API和Adapter的国内镜像API
- Android学习笔记二十三之ListView列表视图一
- Android学习笔记二十三之ListView列表视图一
- Android学习笔记二十四之ListView列表视图二
- Android学习笔记二十四之ListView列表视图二
- 列表视图ListView之二
- Android列表视图ListView和ListActivity-android学习之旅(二十四)
- Android 学习笔记二十三之 ActionBar
- Android学习笔记二十七之ExpandableListView可折叠列表和StackView栈视图
- Android学习笔记二十七之ExpandableListView可折叠列表和StackView栈视图
- Android列表视图(ListView--ArrayAdapter)学习
- Android列表视图(ListView--SimpleAdapter)学习
- Android列表视图(ListView--SimpleCursorAdapter)学习
- Android列表视图(ListView--ArrayAdapter)学习
- Android组件之ListView(列表视图)
- Android之如何使用ListView列表视图
- Android第五天之ListView列表视图
- Android ListView 列表视图
- Android ListView 列表视图
- INS-06002: Authentication failed
- java web-文件下载
- 图片url为空与data-src的使用
- LightTools 8.4版本新功能之其他功能改进
- Tcp连接的建立与终止
- Android学习笔记二十三之ListView列表视图一
- Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代
- NOIP 7.7TG模拟总结
- javaweb笔记一------eclipse的设置
- 微信JSSDK开发,调用微信扫一扫 JAVA & jsp前端 & js实现
- CSS3 @font-face 规则
- GSON使用笔记 -- 序列化时排除字段的几种方式
- PHP iconv 解决utf-8和gb2312编码转换问题
- 什么样的类型可以作为python字典的key