您的位置:首页 > 移动开发 > Android开发

安卓--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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息