最近一个多月忙着使用新的技术来做项目,现在项目上线了,嗯,发现android有些生疏了,所以今天特地写了这一篇博客来相信的讲解一些基础知识,同事呢,也可以让我温故知新一下。进入正题。
什么是listview呢,它有什么作用呢,并且应该怎么使用呢?下面就好好讲解一下。
listview,你可以这样理解,这是一个列表,在手机屏幕上以列表的形式展示每一条数据,比如我们很熟悉的腾讯qq中腾讯新闻,那一条条新闻,就是使用了listview来实现,通过listview来把这些数据展示到手机屏幕上。我个人认为,listview这个控件在android中是相当相当的重要的。
下面,我们看看怎么使用它。
首先,我们在布局文件中将这个控件添加进来
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none" />
android:scrollbars="none"这个是listView中的一个属性,作用是去掉滑动进度条。而id的作用主要是获得获得这个listview控件,然后我们在java文件中通过findViewById(R.id.listview)来拿到这个控件。好下面最主要的部分来了。
我们知道,listview的作用是将数据以列表的形式展示出来,那么那么列表中每一个item中的数据是是怎么弄呢?adapter的作用就出来了,adapter 也叫适配器,你可以理解为是一个中转站。
那么adapter怎么用呢,上代码:
- public class ListViewAdapter extends BaseAdapter {
- View[] itemViews;
- public ListViewAdapter(List<info> mlistInfo) {
- // TODO Auto-generated constructor stub
- itemViews = new View[mlistInfo.size()];
- for(int i=0;i<mlistInfo.size();i++){
- info getInfo=(info)mlistInfo.get(i); //获取第i个对象
- //调用makeItemView,实例化一个Item
- itemViews[i]=makeItemView(
- getInfo.getTitle(), getInfo.getDetails(),getInfo.getAvatar()
- );
- }
- }
- public int getCount() {
- return itemViews.length;
- }
- public View getItem(int position) {
- return itemViews[position];
- }
- public long getItemId(int position) {
- return position;
- }
- //绘制Item的函数
- private View makeItemView(String strTitle, String strText, int resId) {
- LayoutInflater inflater = (LayoutInflater) ListTestActivity.this
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- // 使用View的对象itemView与R.layout.item关联
- View itemView = inflater.inflate(R.layout.item, null);
- // 通过findViewById()方法实例R.layout.item内各组件
- TextView title = (TextView) itemView.findViewById(R.id.title);
- title.setText(strTitle); //填入相应的值
- TextView text = (TextView) itemView.findViewById(R.id.info);
- text.setText(strText);
- ImageView image = (ImageView) itemView.findViewById(R.id.img);
- image.setImageResource(resId);
- return itemView;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
-
if(convertView == null)
{
convertView = mInflater.inflate(R.layout.list_item, null);
}
ImageView img = (ImageView)convertView.findViewById(R.id.img)
TextView title = (TextView)convertView.findViewById(R.id.title);
TextView info = (TextView)ConvertView.findViewById(R.id.info);
img.setImageResource(R.drawable.ic_launcher);
title.setText("Hello");
info.setText("world");
return convertView;
}
- }
- public class ViewHolder(){
- //获取控件
- }
- }
首先继承BaseAdapter,然后实现四个方法,
getCount() ,这个方法的作用的是显示listview中item的个数。getItem()是得到每一个item的位置,getItemId(),是指每一个item的ID,最后一个方法,也是最重要的一个方法getView(),这个方法涉及到整个listview的机制,比如复用,
该怎么解释这个复用机制的,举个例子,我们用10个圆形滚木,要移动一个很重的物体,当物体滚到前面,物体地下最后面的一个滚木就拿到最前面,listview复用也是这个原理。
先创建一个内部类,viewholder可以理解为在每一个滚木中做一个标记,等下一看到这个标记的时候,系统就可以知道,又用到这个滚木了,然后通过判断convertView使用为空,如果为空的话,说明这个滚木没有使用过,则系统会填充器LayoutInflater来将这个滚木做一个标记,如果不为空的话,说明使用过了,则也是TextView title = (TextView)convertView.findViewById(R.id.title);通过convertView来获取控件。
好了,适配器的讲解到这,那么我们在java代码中怎样使用它的,在java代码中通过findViewById这个方法来获取listview这个控件,然后
ListViewAdapter mAdapter = new ListViewAdapter(),来得到这个适配器,最后通过listview.setAdapter(mAdapter),就OK了。