最常用和最难用的控件ListView——2018年4月17日(笔记)

ListView控件

    在程序中需要大量数据的时候,可以用上下滑动的方法浏览更多的数据。

    1.建立一个简单的ListView项目

        首先先建立一个项目,在默认的activity_main.xml中加入ListView控件,其中对长度宽度全部设定成match_parent,让其充满整个空间。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
  >
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </ListView>

</LinearLayout>

    2.使用ArrayAdapter,通过泛型来制定要适配的数据类型,在构造函数中将要适配的函数传入。暂时使用的是字符串类型。今天同时还接触到了创建自定义的适配器,继承ArrayAdapter,并且将泛型指为新创建的类。

    先新创建一个类,其中name代表名称,imageId代表所需要的图片资源的id。

package com.example.listviewtest;

/**
 * Created by hp on 2018/4/17.
 */

public class People {
    private String name;
    private  int imageId;
    public People(String name,int imageId){
        this.name = name;
        this.imageId = imageId;
    }
    public String getName(){
        return name;
    }
    public int getImageId(){
        return imageId;
    }
}

    然后创建一个新的适配器,继承ArrayAdapter,命名为FruitAdapter,代码如下:

    其中的粉色字体是用来提升ListView的运行效率,在getView()的方法中还有一个convertView参数,这个参数是用于将之前加载好的页面布局进行缓存,以便以后使用

    如果是convertView为null就需要去加载布局,如果不是的话,直接使用。

package com.example.listviewtest;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by hp on 2018/4/17.
 */

public class FruitAdapter extends ArrayAdapter<People>{
    //项布局id
    private int resourceId;
    //将上下文,ListView的子项布局的id和数据传递进来
    public FruitAdapter(Context context, int textViewResourceId, List<People> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }
        @Override
        //重写getView的方法
        public View getView(int posotion,View convertView, ViewGroup parent){
            People people = getItem(posotion);//获取当前的People的实例项
            //View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
            View view;
            if(convertView == null){
                view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
            }else{
                view = convertView;
            }
            ImageView fruitImage = (ImageView) view.findViewById(R.id.list_view1);
            TextView fruitName = (TextView) view.findViewById(R.id.people_name);
            fruitImage.setImageResource(people.getImageId());
            fruitName.setText(people.getName());
            return view;

    }
}

根据网上的解释(侵权删)

这是一段很典型的适配器代码实例,我们一行一行来看。
//定义适配器名字,并继承ArrayAdapter类,指定泛型为Fruit
public class FruitAdapter extends ArrayAdapter<Fruit> {
//定义资源Id
private int resourceId;
//构造函数,指定了三个参数
public FruitAdapter(Context context, int textViewResourceId,
List<Fruit> objects) {
//表示重写父类方法
super(context, textViewResourceId, objects);
//把传入的资源Id赋值给resourceId
resourceId = textViewResourceId;
}
//重写getView方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//获得传入的对象,getItem是ArrayAdapter中的方法,就是返回传入集合中的对象
Fruit fruit = getItem(position);
//根据传入的资源id解析布局文件
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
//获得该布局文件下的ImageView
ImageView fImage = (ImageView) view.findViewById(R.id.fruit_image);
//获得该布局文件下的TextView
TextView fname = (TextView) view.findViewById(R.id.fruit_name);
//设置图片
fImage.setImageResource(fruit.getImageId());
//设置名称
fname.setText(fruit.getName());
//返回该视图
return view;
}
}

3.根据上方的方法就可以调用setImageResource()和setText()方法来获取需要显示的图片和文字

package com.example.listviewtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private List<People> peopleList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initPeoples();
        FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,peopleList);
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }
    private void initPeoples(){
        for(int i = 0;i<20;i++){
            People one = new People("-----------------",R.drawable.timg_3);
            peopleList.add(one);
        }
    }
}

对创建简单的适配器有一点心得,要知道其中的数据代表着什么,对已经重复使用的代码做到熟悉,看见能看懂的地步。

适配器现在在我这里的理解就是连接数据和页面的一个中转站,把数据传入方法,在页面需要的时候调用。


阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

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