【效果展示】

效果圖.png
【程序結(jié)構(gòu)】

目錄結(jié)構(gòu).png
【思路解析】

ListView.jpg
1.程序運(yùn)行時(shí)會(huì)進(jìn)入MainActivity對(duì)PXDListView進(jìn)行加載;
2.PXDListView里面對(duì)ListView進(jìn)行封裝,封裝了適配器Adapter的相關(guān)操作(具體代碼見(jiàn)下文)
3.創(chuàng)建DataManager類(lèi)來(lái)管理數(shù)據(jù):用來(lái)管理數(shù)據(jù):存儲(chǔ)解析之后的數(shù)據(jù)、加載數(shù)據(jù)、保存數(shù)據(jù)、更改數(shù)據(jù)。4.創(chuàng)建FriendItem類(lèi)來(lái)管理每個(gè)視圖。5.創(chuàng)建FriendModle類(lèi)來(lái)管理每個(gè)數(shù)據(jù)的模型。6.創(chuàng)建DataUtils類(lèi)來(lái)管理數(shù)據(jù)的相關(guān)工具
【代碼實(shí)現(xiàn)】
【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的方法抽出來(lái)
*/
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(){
// 設(shè)置適配器setAdapter()
setAdapter(new MyAdapter());
}
/**
* 2.配置數(shù)據(jù)適配器:創(chuàng)建一個(gè)類(lèi)繼承BaseAdapter
*/
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
// 獲取數(shù)據(jù)個(gè)數(shù)
return DataManager.sharedManager.getDataSource().size();
}
@Override
public Object getItem(int position) {
// 獲取數(shù)據(jù)對(duì)象
return DataManager.sharedManager.getDataSource().get(position);
}
@Override
public long getItemId(int position) {
// 獲取對(duì)象ID
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 獲取這個(gè)item對(duì)應(yīng)的數(shù)據(jù)模型
FriendModle modle = DataManager.sharedManager.getDataSource().get(position);
// 創(chuàng)建管理item的對(duì)象
FriendItem item = new FriendItem(getContext(),modle);
return item.rootView;
}
}
}
【DataManager.java】
package com.example.a18_listview_icon_name;
import java.util.ArrayList;
/**
* 用來(lái)管理數(shù)據(jù):存儲(chǔ)解析之后的數(shù)據(jù)、加載數(shù)據(jù)、保存數(shù)據(jù)、更改數(shù)據(jù)
* 為保證這個(gè)對(duì)象只有一個(gè):?jiǎn)卫J? *
* 單例模式:
* 1.禁用構(gòu)造方法
* 2.定義單例對(duì)象
*/
public class DataManager {
// 保存所有數(shù)據(jù)
private ArrayList<FriendModle> dataSource;
// 禁用構(gòu)造方法
private DataManager(){
// 調(diào)用加載數(shù)據(jù)方法
loadData();
}
// 提供單例對(duì)象 -> 餓漢式
public static final DataManager sharedManager = new DataManager();
// 提供set get方法
public ArrayList<FriendModle> getDataSource() {
return dataSource;
}
/**
* 加載數(shù)據(jù)方法
*/
private void loadData(){
// 使用假數(shù)據(jù)的方式,記載所有數(shù)據(jù)
// 調(diào)用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 {
// 傳入這個(gè)item的模型數(shù)據(jù)
private FriendModle modle;
// 這個(gè)item的對(duì)應(yīng)視圖
public View rootView;
// 保存上下文
private Context context;
// 創(chuàng)建的同時(shí)需要傳遞這個(gè)item對(duì)應(yīng)的數(shù)據(jù)模型
public FriendItem(Context context,FriendModle modle) {
this.modle = modle;
this.context = context;
initView();
}
private void initView() {
// 獲取對(duì)應(yīng)容器視圖,每一個(gè)數(shù)據(jù)顯示的樣式
ViewGroup v = (ViewGroup) View.inflate(context, R.layout.layout_qq_friend,null);
// 將數(shù)據(jù)顯示到視圖容器對(duì)應(yīng)的控件上
// 獲取圖片子視圖
ImageView icon = v.findViewWithTag(context.getApplicationContext().getString(R.string.iconTag));
// 獲取文本子視圖
TextView name = v.findViewWithTag(context.getResources().getString(R.string.nameTag));
// // 獲取數(shù)據(jù)模型
// FriendModle modle = DataManager.sharedManager.getDataSource().get(position);
// 顯示數(shù)據(jù)
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;
// 好友昵稱(chēng)
public String name;
// 提供構(gòu)造方法
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;
/**
* 管理數(shù)據(jù)工具
* 類(lèi)方法(靜態(tài)方法):如果只關(guān)心方法本身,就使用類(lèi)方法
* 工具類(lèi)里面的方法都是類(lèi)方法 -> public static...
* 對(duì)象方法:如果有數(shù)據(jù)需要數(shù)據(jù)存儲(chǔ)
*/
public class DataUtils {
/**
* 自己構(gòu)造數(shù)據(jù)
*/
public static ArrayList<FriendModle> loadCustomData(){
// 準(zhǔn)備數(shù)組
ArrayList<FriendModle> friends = new ArrayList<>();
for (int i = 0; i < 30; i++){
// 創(chuàng)建模型對(duì)象
FriendModle modle = new FriendModle(R.drawable.icon,"Android實(shí)戰(zhàn)");
// 加入數(shù)組
friends.add(modle);
}
return friends;
}
/**
* 本地加載(文件)
*/
public static Object loadFromFile(){
return null;
}
/**
* 數(shù)據(jù)庫(kù)加載
*/
public static Object loadFromSql(){
return null;
}
/**
* 網(wǎng)路加載
*/
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">
<!--調(diào)用自己寫(xiě)的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>