安卓--ListView和Adapter的关系和如何使用实例

 说在前面:

在做联系人列表和消息列表之类的时候经常用到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

发布了23 篇原创文章 · 获赞 36 · 访问量 11万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览