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了
教程结束!