ListView 与 Adapter 使用技巧

    技术2026-04-08  3

    在android开发中,listview是比较常用的一个组件,它以列表的形式显示数据。列表显示需要三个元素:

    1、listview用来显示具体列表的view

    2、XXAdapter适配器用来把具体的数据映射到listview

    3、具体需要展示的数据,比如文字,图片,按钮等组件

     

    listview的适配器类型主要分为三种:ArrayAdapter、SimpleAdapter、SimpleCursorAdapter。

    ArrayAdapter比较简单,只能显示一行文字,SimpleAdapter扩充性很好,可以自己定义出很多种效果,SimpleCursorAdapter可以和数据库很好的结合,把数据库中的表的内容展示到列表上。

     

    有些时候,由于我们需要展示的数据量很大,而且也需要美化显示的效果,这时我们就需要自定义一个适配器,只需继承BaseAdapter,实现它的 四个方法。listview在开始绘制的时候,首先调用getCount()方法,得到需要绘制的item数量,再调用getView绘制每一个 item,每调用一次getView都会实例化一个view对象,因此对于显示大量数据的时候,必须进行优化。下面是一个小例子,getView方法对 listview进行了一定的优化,当listview的某一项被选择或者点击时,更换该项的背景图片。源码如下:

    ListViewActivity.java package com.alex.activity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemSelectedListener; public class ListViewActivity extends Activity { /** Called when the activity is first created. */ private List<Map<String, Object>> datas = null; //存放初始化数据 private ListView roomListView = null; //Button back; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去除窗口的title区域 this.requestWindowFeature(Window.FEATURE_NO_TITLE); //全屏显示 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); this.setContentView(R.layout.listview); initDatas(); findViews(); } private void initDatas() { datas = new ArrayList<Map<String,Object>>(); for(int i=0;i<12;i++) { Map<String, Object> itemMap = new HashMap<String,Object>(); itemMap.put("data", "测试数据"+i); datas.add(itemMap); } } private void findViews() { roomListView = (ListView)findViewById(R.id.room_list); roomListView.setAdapter(new MyListViewAdapter(this)); roomListView.setVerticalScrollBarEnabled(true); //显示垂直滚动条 roomListView.setSelection(0); //默认选中第一项 } public class MyListViewAdapter extends BaseAdapter { private LayoutInflater mInflater; //作用:把xml布局文件实例化成View public MyListViewAdapter(Context context) { this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if(convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.list_row, null); convertView.setBackgroundResource(R.drawable.dtht_1); holder.data = (TextView)convertView.findViewById(R.id.data); convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } holder.data.setText(String.valueOf(datas.get(position).get("data"))); return convertView; } } public final class ViewHolder { TextView data; } } listview.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/room_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:listSelector="@drawable/dtht_2" android:background="@drawable/dtht_1" android:cacheColorHint="#00000000" android:divider="#00000000" android:dividerHeight="1dip" /> </LinearLayout> </FrameLayout> list_row.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/data" android:layout_width="fill_parent" android:layout_height="36dip" android:layout_alignParentLeft="true" android:gravity="center" android:textColor="#ffffff" /> </RelativeLayout>

     

    最新回复(0)