Android优化版ListView(附源代码)

本文详细介绍了Android中ListView的使用,通过五个逐步深入的代码块展示了如何结合Adapter实现ListView的数据填充。从XML主布局、Item布局到内容类、自定义Adapter的编写,最后在主函数中设置Adapter并填充数据,适合初学者学习。
摘要由CSDN通过智能技术生成

 本文是博主对Adapter(适配器)的一些理解,为了加深对Adapter的理解以及记录自己的阶段学习而写,同时也适合初学者阅读,参考本条博客的逻辑进行学习。

首先有5个代码块,由简单到难,也是按这个顺序来

目录

(1)XML主代码

 (2)XML布局代码

(3)Java内容类代码

 (4)Java自定义Adapter代码

 (5)Java主代码


(1)XML主代码

(1)只需要一个LIstView来实现,不需要填充内容。因为整个屏幕都是ListView,后面我们再往里面填充即可。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv_base" />
</LinearLayout>

 (2)XML布局代码

(2)这是为了实现每个Item的元素是怎么样来布局的,比如把图片放在哪个位置,文字放在图片左边等等。当然只是布局,并不填充内容进去。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imaged"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="5dp" />
    <LinearLayout
        android:layout_width="wrap_content"
        android:orientation="vertical"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="22dp"/>
        <TextView
            android:id="@+id/tv_subtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="13dp"/>

    </LinearLayout>
</LinearLayout>

(3)Java内容类代码

(3)然后下面就是Java内容类代码,这是为了填充内容和获取内容的类,不需要继承什么,主要是为了以下Java主函数和Java自定义适配器类中的List容器限制泛型,只能传入内容类对象

package com.example.adapter_test.base_class;

public class LayoutData {
    private int imageViewID;
    private String textView;
    private String subtextView;

    public LayoutData(int imageViewID, String textView, String subtextView) {
        this.imageViewID = imageViewID;
        this.textView = textView;
        this.subtextView = subtextView;
    }

    public int getImageViewID() {
        return imageViewID;
    }

    public String getTextView() {
        return textView;
    }

    public String getSubtextView() {
        return subtextView;
    }
}

 (4)Java自定义Adapter代码

(4)然后就是比较难理解的Java自定义Adapter类的编写,话不多说,注释已经很详细了,这个类主要是把数据和ListView连接起来,在主函数中调用此类,最重要的就是getView()方法,灵活度高。

package com.example.adapter_test.base_class;

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

import androidx.annotation.LayoutRes;

import com.example.adapter_test.R;

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

public class MyAdapter extends BaseAdapter {
    //定义数据
    private List<LayoutData> data = new ArrayList<LayoutData>();
    //定义上下文
    private Context context;
    //定义xml布局文件(也可以直接设置,此处是为了通用度高)
    private int mResource;
    
    //让主函数传参过来(数据,上下文,xml布局文件)
    public MyAdapter(List<LayoutData> data, Context context, @LayoutRes int resource) {
        this.data = data;
        this.context = context;
        this.mResource = resource;
    }
    //下面三个重写函数基本不变
    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //定义一个holder对象
        ViewHolder holder;
        //调用上方的getItem函数,由于向上转换为Object,需要类型转换
        //等于data.get(position),这样的话就不用类型转换了
        //此处作用是获取对应position的List<Layoutdata> data列表数据的图片和文字
        LayoutData dd= (LayoutData) getItem(position);
        //判断是否已经创建过了,如果没创建过
        if(convertView == null)
        {
            //创建一个holder对象用来存储findViewByid的控件
            holder = new ViewHolder();
            //实例化布局
            convertView=LayoutInflater.from(context).inflate(mResource,
                    parent, false);
            //在布局中找控件
            holder.img = (ImageView)convertView.findViewById(R.id.imaged);
            holder.title = (TextView)convertView.findViewById(R.id.tv_title);
            holder.subtitle = (TextView)convertView.findViewById(R.id.tv_subtitle);
            //储存对象
            convertView.setTag(holder);
        }
        //已经创建过了
        else
        {   //就不用再找控件了
            holder = (ViewHolder)convertView.getTag();
        }
        //以下三句必须放在if语句的外面,否则只会显示一条
        //设置图片和文字
        holder.img.setImageResource(dd.getImageViewID());
        holder.title.setText(dd.getTextView());
        holder.subtitle.setText(dd.getSubtextView());
        //返回填充完成的Item
        return convertView;
    }

    //储存控件类,布局里有什么控件就定义什么
    class ViewHolder{
        public ImageView img;
        public TextView title;
        public TextView subtitle;
    }
}

 (5)Java主代码

(5)最后就是Java主函数,这个比较简单,找一下XML里面的ListView,然后定义一个List<LayoutData> data的容器为了存放数据,然后在OnCreate()中填充一下数据,再为ListView设置一个Adapter就可以显示了。

package com.example.adapter_test;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ListView;

import com.example.adapter_test.base_class.LayoutData;
import com.example.adapter_test.base_class.MyAdapter;

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

public class BaseAdapter extends AppCompatActivity {
    ListView listView;
    List<LayoutData> data = new ArrayList<LayoutData>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_adapter);
        listView = findViewById(R.id.lv_base);
        initdata();
        listView.setAdapter(new MyAdapter(data,this,R.layout.simple_adapter_2));
        
    }

    private void initdata() {
        LayoutData layoutData1=new LayoutData(R.drawable.local
                ,"无忌哥","999");
        data.add(layoutData1);

        LayoutData layoutData2=new LayoutData(R.drawable.like
                ,"wujige","333");
        data.add(layoutData2);

        LayoutData layoutData3=new LayoutData(R.drawable.share
                ,"oo哥","777");
        data.add(layoutData3);
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七qi_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值