Android列表开发继承BaseAdapter实列教程

前言:时隔3个半月,我又回来了,以后文章会继续跟着走,本来这篇文章是想周六周天更的,但是时间不等人,后面还有其它事忙,因为3.4个月没写文章了可能有点生疏,将就看看~~

今天主要的教程是针对于Android列表<ListView>的一个开发教程,效果如图:

这期教程说难也不难说简单也不简单,其实现在大多流行的也都是嵌套的线性布局列表,如下:

那么下面开始教程:
先放ListView的xml代码和线性布局的代码

ListView部分:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".list"
    android:orientation="vertical"
    >
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="55dp"
        android:dividerHeight="1dp"
        android:divider="#E4E4E4"
        ></ListView>
</LinearLayout>

线性部分(下面这段看看就行,因为很简单):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    tools:context=".list_item"
    android:orientation="horizontal"
    android:padding="10dp"

    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:gravity="center"
        >

        <TextView
            android:id="@+id/listid"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:background="#f00"
            android:gravity="center"
            android:text="1"
            android:textColor="#fff"
            android:textSize="25sp"

            ></TextView>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical"
        android:gravity="center_vertical"
        >
        <TextView
            android:id="@+id/listtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第一章 Android基础入门"
            android:textStyle="bold"
            android:textColor="@color/black"
            android:textSize="18sp"
            ></TextView>
        <TextView
            android:id="@+id/listjieshao"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:text="共计5题"

            ></TextView>

    </LinearLayout>

</LinearLayout>

这段线性布局的xml代码看看就行,不是本章重点,本章重点是BaseAdaper的用法,下面进行java代码编译

下面继续:

Arraylist部分

在列表开发里面有个对象操作,这里的对象用于存放数据,java的“对象”跟js的“对象”不一样,js的对象可以直接在数组里面编译,但是java不行,java得先new,再进行对象操作。

这里我创建了一个Arraylist.java,里面用来存放4个变量

package com.android.xuexi2;
class Arraylist {
    public String id;
    public String title;
    public String jieshao;
    public int color;
}

然后在另一个文件list.java中写入方法initDate(){}

List<Arraylist> alist;//全局变量
Arraylist arraylist;//全局变量
public void initDate(){
    alist=new ArrayList<Arraylist>();
    for(int i=0;i<10;i++){
        arraylist=new Arraylist();
        arraylist.id=i+1+"";
        switch (i){
            case 0:
                arraylist.title="第一章";
                arraylist.jieshao="第一章介绍";
                arraylist.color=(R.drawable.exercises_bg_1);

            break;
            case 1:
                arraylist.title="第二章";
                arraylist.jieshao="第二章介绍";
                arraylist.color=(R.drawable.exercises_bg_2);
                break;
            case 2:
                arraylist.title="第三章";
                arraylist.jieshao="第三章介绍";
                arraylist.color=(R.drawable.exercises_bg_3);
                break;
   }
        alist.add(arraylist);
    }
}

在这个里面我们需要用到方法List<Arraylist>,但是这里我们new的是ArrayList<Arraylist>(<Arraylist>的意思是对接的Arraylist.java中的变量),我们new的ArrayList<>是一个类,如果要使用里面的方法我们就需要里面的一个实列List<>,所以List<ArrayList> alist=new ArrayList<ArrayList>

我们ArrayList的用法就是将变量字符串全写进去,然后需要使用的时候全部调出来,如图:

所以,这里使用for循环与switch就是为了创造多个对象,并且将创建的对象写入List<Arraylist>,这里画个图看的懂些:

这里需要读取某个对象的值时就用
System.out.println(alist.get(0).id);
System.out.println(alist.get(0).title);
第1个对象就get(0);
第2个对象就get(1);
依次类推

这些数据进入对象后在后面就可以直接导入列表,如果需要变换刷新列表就行了。

BaseAdaper

下面就来到继承BaseAdaper后的使用教程,先释放源代码:

package com.android.xuexi2;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
class BaseAdapter extends android.widget.BaseAdapter {
    @Override
    public Object getItem(int position) {
        return null;
    }
    @Override
    public int getCount() {
        return 0;
    }
    @Override
    public long getItemId(int position) {
        return 0;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return null;
    }
}

这里是源代码,下面实列代码,带有注释分析

package com.android.xuexi2;

import androidx.appcompat.app.AppCompatActivity;

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

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

public class list_item extends BaseAdapter {
    Context context;//上下文
    List<Arraylist> alist;//List对象变量
    public list_item(Context context) {
        this.context = context;//用于对接list.java与list_item的上下文
    }
    public void setData(List<Arraylist> alist) {
        this.alist = alist;//从list.java导入List<Arraylist> alist变量
        notifyDataSetChanged();//刷新列表
    }
    //获取Item总数
    @Override
    public int getCount() {
        return alist == null ? 0 : alist.size();
    }
    //根据position得到对应Item的对象
    @Override
    public Arraylist getItem(int position) {
        return alist == null ? null : alist.get(position);
    }
    //根据position获取对应Item的id,一般用于获取Item为第一个
    @Override
    public long getItemId(int position) {
        return position;
    }
    //得到position对应的Item视图,position是当前Item的位置,convertView参数是划出屏幕的Item的View
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        viewhor vb;//内部类viwehor的变量
        if (convertView == null) {
            vb = new viewhor();//new一次viewhor对象
            convertView = LayoutInflater.from(context).inflate(R.layout.activity_list_item, null);
//获取线性布局实列,并将线性布局赋给convertView,这里的context是呼应上下文的意思,也就是Context context
            vb.listid = convertView.findViewById(R.id.listid);//通过convertView获取控件id
            vb.listtitle = convertView.findViewById(R.id.listtitle);//通过convertView获取标题
            vb.listjieshao = convertView.findViewById(R.id.listjieshao);//通过convertView获取介绍
            convertView.setTag(vb);//写入对象内部类viewhor中的3个TextView变量
        } else {
            vb = (viewhor) convertView.getTag();//获取变量对象
        }
        Arraylist arraylist1 = getItem(position);//使用getItem方法获取Item是第几个
//convertView的点击事件
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (arraylist1 == null) {//使用getItem方法获取的Item为空时返回空
                    return;
                }
                System.out.println(getItem(position).title);//输出点击的是第几个的标题
            }
        });
        final Arraylist arraylist = getItem(position);//使用getItem方法获取Item是第几个
        if (arraylist != null) {//当对象变量不为空时执行
            vb.listid.setText(arraylist.id);//更新id值
            vb.listid.setBackgroundResource(arraylist.color);//更新颜色
            vb.listtitle.setText(arraylist.title);//更新标题
            vb.listjieshao.setText(arraylist.jieshao);//更新介绍
        }
        return convertView;//返回convertView
    }
//内部类viewhor
    class viewhor {
//TextView变量
        TextView listid;
        TextView listtitle;
        TextView listjieshao;

    }
}

以上就是列表要导入的线性布局操作,下面是执行代码:

我们在Arraylist部分讲解了对象变量的保存方式,那么我们需要做的就是先将变量存储

list.java执行:
list_item list_item=new list_item(activity);//new list_item.java文件传入Activoty activity进list_item中的无参list_item
ListView listView.setAdapter(list_item);//将线性布局写入适配器
list_item.setData(alist);//将List<Arraylist> alist写入list_item的List<Arraylist> alist;
对应的list_item.java执行代码:
Context context;//上下文
public list_item(Context context) {
    this.context = context;//用于对接list.java与list_item的上下文
}
public void setData(List<Arraylist> alist) {
    this.alist = alist;//从list.java导入List<Arraylist> alist变量
}

到这里就接入成功了,然后运行程序就可以让线性布局导入列表ListView了

教程结束!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注