学习ListView

本文详细介绍了ListView的使用,从ListView的基本配置到数据的传递,再到深入的自定义适配器实现,包括如何创建实体类、定义自定义布局及自定义适配器的getView方法,展示了如何实现ListView的个性化展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ListView初探

1、主界面代码如下:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.listviewadapter.MainActivity">
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>
</LinearLayout>

2、MainActiviyt代码如下:

 

public class MainActivity extends AppCompatActivity {

    private String[] data={"乔丹","科比","詹姆斯","库里","杜兰特","哈登","汤普森",
            "格林","欧文","威斯布鲁克","乔丹","科比","詹姆斯","库里","杜兰特","哈登","汤普森",
            "格林","欧文","威斯布鲁克"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * 创建一个数组适配器的代码,里面有三个参数,第一个参数是上下文,就是当前的Activity,
         * 第二个参数是android sdk中自己内置的一个布局,它里面只有一个TextView,
         * 这个参数是表明我们数组中每一条数据的布局是这个view,就是将每一条数据都显示在这个 view上面;
         * 第三个参数就是我们要显示的数据。listView会根据这三个参数,遍历data里面的每一条数据,
         * 读出一条,显示到第二 个参数对应的布局中,这样就形成了我们看到的listView.
         */
        ArrayAdapter<String> nba=new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_list_item_1,data);
        ListView listView= (ListView) findViewById(R.id.list_view);
        listView.setAdapter(nba);

    }
}

这里先定义了一个nba数组,但是数组中的数据是无法直接传递给listview的,需要借助适配器来完成。这里选择ArrayAdapter。它能通过泛型来指定要适配的数据。在构造函数中把要适配的数据传入。Arrayadapter有多个构造函数的重载,根据实际情况选择最合适的一种。这里选择字符串。里面有三个参数,第一个参数是上下文,就是当前的Activity, 第二个参数是android sdk中自己内置的一个布局,它里面只有一个TextView,这个参数是表明我们数组中每一条数据的布局是这个view,就是将每一条数据都显示在这个 view上面;第三个参数就是我们要显示的数据。listView会根据这三个参数,遍历data里面的每一条数据,读出一条,显示到第二 个参数对应的布局中,这样就形成了我们看到的listView.

最后还要调用Listview的setAdapter方法,将构建好的适配器对象传进去,然后运行即可。

总结一下主要步骤:

1、在主界面添加一个listview控件并且给其一个id

2、MainActivity中,首先将数据提供好,这些数据可以是从网上下载的,也可以是从数据库中读取的,这里我们定义了一个NBA球星的数组

3、onCreat方法中,借助适配器将数据传递给listview,这里选择ArrayAdapter适配器,由于nba球星的姓名都是字符串,所以适配器的泛型指定为String,ArrayAdapter需要传入三个参数,第一个是上下文语境,即当前的Activity,第二个是android sdk自己内置的一个布局,它里面只有一个TextView,这个参数是表明我们数组中每一条数据的布局是这个view,就是将每一条数据都显示在这个 view上面;第三个参数就是需要加载的数据。listView会根据这三个参数,遍历data里面的每一条数据,读出一条,显示到第二 个参数对应的布局中,这样就形成了我们看到的listView.

4、绑定listview,并且为其设置setAdapter方法,将构建好的适配器传递进去。

二、深入了解ListView-----定制listview界面

这里主要学习自定义适配器。

1、定义一个实体类SuperStar,作为listview适配器适配的类型,代码如下:

 

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

实体类中包括球星的名字和头像,并且重写getName和getImageId方法。

3、为listview的子项指定一个我们自定义的布局,新建nba_item.xml,代码如下:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/star_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/star_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp" />
</LinearLayout>

左边显示球星头像,右边显示球星姓名,并且垂直居中显示。

4、接下来就是最重要的一步,自定义适配器啦。这个适配器要继承自ArrayAdapter,并且将泛型指定为我们已经写好的SuperStar实体类。

  自定义适配器NBAAdapter,重写父类ArrayAdapter的一组构造方法,用于将上下文、Listview子项布局的id和数据都传递进来,然后重写getView方法,这个方法在每个子项布局被滚动到屏幕内时会被调用,getview方法首先通过getItem方法得到当前项的SuperStar实例,然后调用LayoutInflater来为这个子项加载我们传入的布局。这里LayoutInflater的inflater方法接收三个参数,第一个是加载的资源Id,第二个是父布局,第三个参数false意思是只让我们在父布局中声明的layout属性生效,但不会为这个View添加父布局,因为一旦View有了父布局,它就不能添加到listview中了。然后调用View的findViewById方法绑定ImageView和TextView方法,再调用set方法为其添加图片和文字,最后将布局返回。具体代码如下:

 

public class NBAAdapter extends ArrayAdapter<SuperStar> {
    private int resourceId;
    public NBAAdapter(Context context, int textViewResourceId, List<SuperStar> objects) {
        super(context,  textViewResourceId, objects);
        resourceId=textViewResourceId;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SuperStar star=getItem(position);//获取当前的nba明星
        View view= LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
        ImageView starImage= (ImageView) view.findViewById(R.id.star_image);
        TextView starName= (TextView) view.findViewById(R.id.star_name);
        starImage.setImageResource(star.getImageId());
        starName.setText(star.getName());
        return view;
    }
}

5、在MainActivity中初始化球星信息

 

public class MainActivity extends AppCompatActivity {
    private List<SuperStar> starList=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initSuperStar();
        NBAAdapter adapter=new NBAAdapter(MainActivity.this,R.layout.nba_item,starList);
       ListView listView= (ListView) findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }
    private void initSuperStar() {
        for (int i=0;i<2;i++){
            SuperStar jordon=new SuperStar("乔丹",R.drawable.nba);
            starList.add(jordon);
            SuperStar kobe=new SuperStar("科比",R.drawable.nba);
            starList.add(kobe);
            SuperStar james=new SuperStar("詹姆斯",R.drawable.nba);
            starList.add(james);
            SuperStar curry=new SuperStar("库里",R.drawable.nba);
            starList.add(curry);
            SuperStar hardon=new SuperStar("哈登",R.drawable.nba);
            starList.add(hardon);
            SuperStar owring=new SuperStar("欧文",R.drawable.nba);
            starList.add(owring);
        }
    }
}

代码中:首先定义一个SuperStar的ArrayList------starList,然后初始化球星信息initSuperStar,用于初始化所有的球星数据。在NBAAdapter中传入三个参数,第一个是上下文语境,此处填入MainActivty,第二个参数是传入的子项布局,第三个是要加入的starList,把数据加入到listview中。然后绑定主布局中的listview,再设置adapter

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值