天天看点

android listview 用法

ListView

ListView是android常用组件,常用于显示一堆数据,类似web ui中的datatable。

ListView展示数据的步骤

  • 定义item布局
  • 定义数据源
  • 将item布局和数据源放入适配器
  • 将适配器与listview关联

最简单的listview

  • item布局文件,这里我们使用android自带的布局文件,android.R.layout.simple_list_item_1

它里边只有一个textview

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>
           
  • 定义数据源,将item布局和数据源放入适配器,将适配器与listview关联

activity代码

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.main_layout);

        ListView lv = (ListView) findViewById(R.id.lv1);

        String[] fruits = {"apple","orange","beach","mango"};
        ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, fruits);
        lv.setAdapter(adapter);


    }
           
  • 最后,主界面的布局文件
<ListView 
        android:id="@+id/lv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ></ListView>
           

效果图

android listview 用法

自定义ListView

有时,我们需要自定义显示多列,列中有图片,说明之类的。自定义说到底就是改变item布局文件

item布局文件

<?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" >

         <ImageView android:id="@+id/myface"
          android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

     <TextView android:id="@+id/myname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="10dp"
        />

</LinearLayout>
           

适配器

public class FruitAdapter extends ArrayAdapter<Fruit> {

    private int resourceId;

    public FruitAdapter(Context context, int resource, List<Fruit> objects) {
        super(context, resource, objects);
        resourceId = resource;
    }

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Fruit fruit = getItem(position);
        View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
        ImageView imageView= (ImageView) view.findViewById(R.id.myface);
        TextView textView = (TextView) view.findViewById(R.id.myname);
        imageView.setImageResource(fruit.getImageId());
        textView .setText(fruit.getName());
        return view;
    }
}   
           
public class Fruit {

    private String name;
    private int imageId;
}
           

getView方法介绍

getView: item滚入到屏幕中时,被调用

第一个参数:position,item在数据源中的位置

第二个参数:convertView,这个参数要重点理解,convertView是滚出屏幕的那个item的布局,在优化ListView时,常常会用这个变量。这样在滚入item时,使用滚出item的布局,然后把值覆盖掉。

优化后的代码

优点:不用每次都加载布局文件

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Fruit fruit = getItem(position);
        View view;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, null);
        } else {
            view = convertView;
        }
        ImageView imageView = (ImageView) view.findViewById(R.id.myface);
        imageView.setImageResource(fruit.getImageId());
        TextView textView = (TextView) view.findViewById(R.id.myname);
        textView.setText(fruit.getName());
        return view;
  }
           

效果

android listview 用法