安卓--ListView和Adapter的关系和如何使用实例
2016-07-08 21:14
561 查看
说在前面:
在做联系人列表和消息列表之类的时候经常用到listview和adapter,相信代码都会写,往上的例子也多的数不胜数,我搜了一下介绍listview和adapter之间关系的博文并不多,说的详细的更少,今天就把我对他们之间关系的理解说一说,说不明白就直接上图;再加上一个例子来说明怎么用。1.listview和adapter之间的关系:
我喜欢安卓字面意思理解,listview就是将单个view进行list化(也可以是group化),便于显示和管理;adapter适配器:适配器就是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口(来自百度百科),看来是把一种东西转换为另一种合适的东西输出以便其他用途。
那么adapter是将什么转换为什么呢?
adapter结合view模板,将数据转换为适合listview的格式,让listview显示。
概念说起来真模糊,文字读起来真枯燥,都是老司机,一言不合就上图。来看概念图:
是不是看着概念图还是不爽,枯燥,看不懂?猜到了,早就准备了实例图:
基本概念和关系就是这样子的,其中viewholder的作用:顾名思义,hold住view模板,重复利用,不用再每次使用的时候重新加载了。hold住view后只需要将数据往里面写就好了。
2.实例和代码说明
就上面示例图给出的例子,结合相关代码进行说明:
先给出自定义数据结构部分:
public class ChatRecond { public String portrait; public String nick; public String msgview; public int msghour; public int msgminute; public String msgnum; public int portraitaddr; }
接下来是数据部分:
import java.util.ArrayList; import java.util.Calendar; import com.example.testandroid.Adapter.chatlist_Adapter; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; public class chat_list extends Activity { private ListView mListView; chatlist_Adapter mAdapter ; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.mlistview);//这里是你的listview所在的XML文件 ArrayList<ChatRecond> chatdata=new ArrayList<ChatRecond>(); mListView = (ListView) this.findViewById(R.id.baselistview);//这儿是你基本的listview控件 ChatRecond cRecond1 = new ChatRecond();//自定义数据结构以及添加数据 cRecond1.portraitaddr = R.drawable.adobe1; cRecond1.nick = "柯基"; cRecond1.msgnum = "1"; cRecond1.msgview = "我是柯基!"; Calendar now = Calendar.getInstance(); cRecond1.msghour = now.get(Calendar.HOUR); cRecond1.msgminute = now.get(Calendar.MINUTE); ChatRecond cRecond2 = new ChatRecond(); cRecond2.portraitaddr = R.drawable.adobe2; cRecond2.nick = "泰迪"; cRecond2.msgnum = "2"; cRecond2.msgview = "我是泰迪!"; now = Calendar.getInstance(); cRecond2.msghour = now.get(Calendar.HOUR); cRecond2.msgminute = now.get(Calendar.MINUTE); ChatRecond cRecond3 = new ChatRecond(); cRecond3.portraitaddr = R.drawable.adobe3; cRecond3.nick = "京巴"; cRecond3.msgnum = "3"; cRecond3.msgview = "我是京巴!"; now = Calendar.getInstance(); cRecond3.msghour = now.get(Calendar.HOUR); cRecond3.msgminute = now.get(Calendar.MINUTE); chatdata.add(cRecond1); chatdata.add(cRecond2); chatdata.add(cRecond3); mAdapter =new chatlist_Adapter(this,chatdata);//适配器关联到数据和listview mListView.setAdapter(mAdapter);//set一下 } }
再就是单个的view模板:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="@dimen/textview_height1" android:layout_marginTop="10dp" android:orientation="horizontal" > <FrameLayout android:layout_width="0dp" android:layout_weight="23" android:layout_height="@dimen/portrait_height" > <ImageView android:id="@+id/chat_item_portrat" android:layout_width="match_parent" android:contentDescription="user_portrait" android:layout_height="match_parent" android:layout_margin="5dp" android:background="@drawable/copyright" android:gravity="center" /> <TextView android:id="@+id/chat_item_messagetips" android:layout_width="20dp" android:layout_height="20dp" android:layout_gravity="top|end" android:background="@drawable/shapes_oval_msgtip" android:textColor="#ffffff" android:textStyle="bold" android:gravity="top|center" android:textSize="15dp" android:text="1" /> </FrameLayout> <LinearLayout android:layout_width="0dp" android:layout_weight="100" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="@dimen/textview_nickname_height" android:orientation="horizontal" > <TextView android:id="@+id/chat_item_nickname" android:layout_width="0dp" android:layout_weight="5" android:layout_height="match_parent" android:gravity="center_vertical" android:layout_marginLeft="10dp" android:textColor="#000000" android:textSize="16sp" android:textStyle="bold" android:text="" /> <TextView android:id="@+id/chat_item_messagetime" android:layout_width="0dp" android:layout_weight="2" android:layout_height="match_parent" android:gravity="center" android:text=""/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="@dimen/textview_messageview_height" android:orientation="horizontal" > <TextView android:id="@+id/chat_item_messageview" android:layout_width="0dp" android:layout_height="match_parent" android:layout_marginLeft="10dp" android:layout_weight="4" android:ellipsize="end" android:gravity="center_vertical" android:lines="1" android:text="" /> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:visibility="invisible" /> </LinearLayout> </LinearLayout> </LinearLayout>
listview程序:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/baselistview" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
最后就是adapter了
import java.util.ArrayList; import com.example.testandroid.ChatRecond; import com.example.testandroid.R; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class chatlist_Adapter extends BaseAdapter { private LayoutInflater minflater; private Context mContext; ArrayList<ChatRecond> mData; public chatlist_Adapter(Context context, ArrayList<ChatRecond> data) {//构造函数 // TODO Auto-generated constructor stub mContext = context; minflater = LayoutInflater.from(context); mData = data; } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // // TODO Auto-generated method stub if (convertView == null) {//view为空则创建view convertView = creatView(); } bindView(position, convertView);//给view写入值 return convertView; } public View creatView() { //createview函数,将单个view模板里的控件ID绑定到viewholder对应的每个属性上 View view = minflater.inflate(R.layout.chat_item, null); viewHolder vHolder = new viewHolder(); vHolder.portriat = (ImageView) view.findViewById(R.id.chat_item_portrat); vHolder.msgnum = (TextView) view.findViewById(R.id.chat_item_messagetips); vHolder.nickname = (TextView) view.findViewById(R.id.chat_item_nickname); vHolder.msgview = (TextView) view.findViewById(R.id.chat_item_messageview); vHolder.msgtime = (TextView) view.findViewById(R.id.chat_item_messagetime); view.setTag(vHolder);//settag,下面的gettag要用到 return view; } public void bindView(int posotion, View view) {//用于根据数据集的数据项给view写入 ChatRecond chatRecond = mData.get(posotion); viewHolder vHolder = (viewHolder) view.getTag();//你看,gettag了吧 vHolder.portriat.setBackgroundResource(chatRecond.portraitaddr);//将具体值写入 vHolder.msgnum.setText(chatRecond.msgnum); vHolder.nickname.setText(chatRecond.nick); vHolder.msgview.setText(chatRecond.msgview); vHolder.msgtime.setText(chatRecond.msghour+":"+chatRecond.msgminute); } public class viewHolder { public ImageView portriat;//对应到view中控件ID public TextView nickname; public TextView msgview; public TextView msgnum; public TextView msgtime; } }
还有补充的:
感谢东软张建伟老师给我们总结的使用listview和adapter六个步骤,很受用
1.初始化listview 2.初始化数据集 3.构建Adapter 4.通过Adapter构建view(这里的view指的是程序中的view,不是上文提到的XML中的view模板) 5.给构建的view写入对应的数据 6.关联listview和Adapter
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories