【效果展示】
【程序结构】
【思路解析】
1.程序运行时会进入MainActivity对PXDListView进行加载;
2.PXDListView里面对ListView进行封装,封装了适配器Adapter的相关操作(具体代码见下文)
3.创建DataManager类来管理数据:用来管理数据:存储解析之后的数据、加载数据、保存数据、更改数据。4.创建FriendItem类来管理每个视图。5.创建FriendModle类来管理每个数据的模型。6.创建DataUtils类来管理数据的相关工具
【代码实现】
【PXDListView.java】
package com.example.a18_listview_icon_name;
import android.content.Context;
import android.provider.ContactsContract;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
/**
* 将ListView的方法抽出来
*/
public class LJRListView extends ListView {
public LJRListView(Context context) {
super(context);
initData();
}
public LJRListView(Context context, AttributeSet attrs) {
super(context, attrs);
initData();
}
// 初始化
private void initData(){
// 设置适配器setAdapter()
setAdapter(new MyAdapter());
}
/**
* 2.配置数据适配器:创建一个类继承BaseAdapter
*/
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
// 获取数据个数
return DataManager.sharedManager.getDataSource().size();
}
@Override
public Object getItem(int position) {
// 获取数据对象
return DataManager.sharedManager.getDataSource().get(position);
}
@Override
public long getItemId(int position) {
// 获取对象ID
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 获取这个item对应的数据模型
FriendModle modle = DataManager.sharedManager.getDataSource().get(position);
// 创建管理item的对象
FriendItem item = new FriendItem(getContext(),modle);
return item.rootView;
}
}
}
【DataManager.java】
package com.example.a18_listview_icon_name;
import java.util.ArrayList;
/**
* 用来管理数据:存储解析之后的数据、加载数据、保存数据、更改数据
* 为保证这个对象只有一个:单例模式
*
* 单例模式:
* 1.禁用构造方法
* 2.定义单例对象
*/
public class DataManager {
// 保存所有数据
private ArrayList<FriendModle> dataSource;
// 禁用构造方法
private DataManager(){
// 调用加载数据方法
loadData();
}
// 提供单例对象 -> 饿汉式
public static final DataManager sharedManager = new DataManager();
// 提供set get方法
public ArrayList<FriendModle> getDataSource() {
return dataSource;
}
/**
* 加载数据方法
*/
private void loadData(){
// 使用假数据的方式,记载所有数据
// 调用DataUtils里面的loadCustomData()方法
dataSource = DataUtils.loadCustomData();
}
}
【FriendItem.java】
package com.example.a18_listview_icon_name;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
/**
* 管理视图
*/
public class FriendItem {
// 传入这个item的模型数据
private FriendModle modle;
// 这个item的对应视图
public View rootView;
// 保存上下文
private Context context;
// 创建的同时需要传递这个item对应的数据模型
public FriendItem(Context context,FriendModle modle) {
this.modle = modle;
this.context = context;
initView();
}
private void initView() {
// 获取对应容器视图,每一个数据显示的样式
ViewGroup v = (ViewGroup) View.inflate(context, R.layout.layout_qq_friend,null);
// 将数据显示到视图容器对应的控件上
// 获取图片子视图
ImageView icon = v.findViewWithTag(context.getApplicationContext().getString(R.string.iconTag));
// 获取文本子视图
TextView name = v.findViewWithTag(context.getResources().getString(R.string.nameTag));
// // 获取数据模型
// FriendModle modle = DataManager.sharedManager.getDataSource().get(position);
// 显示数据
icon.setImageResource(modle.iconID);
name.setText(modle.name);
rootView = v;
}
}
【FriendModle.java】
package com.example.a18_listview_icon_name;
import android.graphics.Paint;
public class FriendModle {
// 头像资源id
public int iconID;
// 好友昵称
public String name;
// 提供构造方法
public FriendModle(int iconID, String name) {
this.iconID = iconID;
this.name = name;
}
}
【DataUtils.java】
package com.example.a18_listview_icon_name;
import java.util.ArrayList;
/**
* 管理数据工具
* 类方法(静态方法):如果只关心方法本身,就使用类方法
* 工具类里面的方法都是类方法 -> public static...
* 对象方法:如果有数据需要数据存储
*/
public class DataUtils {
/**
* 自己构造数据
*/
public static ArrayList<FriendModle> loadCustomData(){
// 准备数组
ArrayList<FriendModle> friends = new ArrayList<>();
for (int i = 0; i < 30; i++){
// 创建模型对象
FriendModle modle = new FriendModle(R.drawable.icon,"Android实战");
// 加入数组
friends.add(modle);
}
return friends;
}
/**
* 本地加载(文件)
*/
public static Object loadFromFile(){
return null;
}
/**
* 数据库加载
*/
public static Object loadFromSql(){
return null;
}
/**
* 网路加载
*/
public static Object loadFromServer(){
return null;
}
}
【MainActivity.java】
package com.example.a18_listview_icon_name;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import java.util.zip.Inflater;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
【activity_main.xml】
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MainActivity">
<!--调用自己写的ListView-->
<com.example.a18_listview_icon_name.LJRListView
android:id="@+id/lv_qqlist"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
【layout_qq_friend.xml】
<?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:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="20dp"
android:tag="@string/iconTag"
android:scaleType="fitXY"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="20dp"
android:gravity="center_vertical"
android:textSize="30sp"
android:textColor="#000"
android:tag="@string/nameTag"/>
</LinearLayout>