Android的ListView,使用封装和MVC的设计模式
程序员文章站
2024-02-26 09:35:22
...
此篇博客链接是对下面代码的写出的步骤过程,及碎片的分析:
https://blog.csdn.net/weixin_44614751/article/details/103215320
运行结果:
工程目录
DataManager里的代码:
package com.example.pxd19qqlist;
import android.provider.ContactsContract;
import java.util.ArrayList;
// 管理数据源
/**
* 存储解析之后的数据
* 加载数据
* 保存数据
* 更改数据
*
* 单例模式:
* 1.禁用构造方法
* 2.定义单例对象 静态 final
*
*/
public class DataManager {
// 保存所有的数据
private ArrayList<FriendModel> dataSource;
// 单例对象
public static final DataManager sharedManager = new DataManager();
// 禁用构造方法
private DataManager(){
loadData();
}
// 加载数据
private void loadData(){
// 用自己创建假数据的方式,加载所有的数据
dataSource = DataUtils.loadCustomData();
}
public ArrayList<FriendModel> getDataSource() {
return dataSource;
}
}
DataUtils里的代码:
package com.example.pxd19qqlist;
import java.util.ArrayList;
/**
* 类方法:如果只关心这个方法本身
* 工具类
* 对象方法:如果需要数据并且保存
*/
public class DataUtils {
/**
* 自己构造数据
*/
public static ArrayList<FriendModel> loadCustomData(){
ArrayList<FriendModel> friends = new ArrayList<>();
for (int i = 0; i < 30; i++) {
FriendModel model = new FriendModel(
R.drawable.icon2,
"王一博");
// 保存
friends.add(model);
}
return friends;
}
/**
* 本地加载(文件)
*/
public static Object loadFromFile(){
return null;
}
/**
* 数据库加载
*/
public static Object loadFromSQL(){
return null;
}
/**
* 网络加载
*/
public static Object loadFromServer(){
return null;
}
}
CircleImageView里的代码
package com.example.pxd19qqlist;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Path;
import android.util.AttributeSet;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
public class CircleImageView extends AppCompatImageView {
public CircleImageView(Context context) {
super(context);
}
public CircleImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
public void draw(Canvas canvas) {
// 1.创建裁剪需要的形状的路径Path
Path path = new Path();
path.addCircle(getPivotX(), getPivotY(), getWidth()/2, Path.Direction.CCW);
// 2.裁剪
canvas.clipPath(path);
super.draw(canvas);
}
}
MainActivity里的代码无
qq_listView里的代码:
package com.example.pxd19qqlist;
import android.content.Context;
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;
public class qq_listView extends ListView {
public qq_listView(Context context) {
super(context);
initData();
}
public qq_listView(Context context, AttributeSet attrs) {
super(context, attrs);
initData();
}
private void initData(){
// 设置适配器
setAdapter(new MyAdapter());
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return DataManager.sharedManager.getDataSource().size();
}
@Override
public Object getItem(int i) {
return DataManager.sharedManager.getDataSource().get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
FriendModel model = DataManager.sharedManager.getDataSource().get(i);
FriendItem item = new FriendItem(getContext(), model);
return item.rootView;
}
}
}
FriendModel里的代码:
package com.example.pxd19qqlist;
public class FriendModel {
public int iconID; // 头像图片资源ID
public String name; // 好友昵称
public FriendModel(int iconID, String name) {
this.iconID = iconID;
this.name = name;
}
}
FriendItem里的代码:
package com.example.pxd19qqlist;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
public class FriendItem {
// 这个Item的数据模型
private FriendModel model;
// 这个Item对应的视图
public View rootView;
// 这是一个普通的类,没有context,所以需要外接告诉当前的
private Context context;
//构造方法 创建的同时需要传递这个Item对应的数据模型
public FriendItem(Context context,FriendModel model) {
this.model = model;
this.context = context;
initView();
}
private void initView() {
// 获取对应的容器视图
ViewGroup v = (ViewGroup)View.inflate(context,
R.layout.layout_qq_friend, null);
// 将数据显示到这个容器对应的控件上
// 获取子视图
ImageView icon = v.findViewWithTag(
context.getResources().getString(R.string.iv_icon)); // 得到真正的数据
TextView name = v.findViewWithTag(
context.getResources().getString(R.string.tv_name));
// 显示数据
icon.setImageResource(model.iconID);
name.setText(model.name);
rootView = v;
}
}
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">
<com.example.pxd19qqlist.CircleImageView
android:tag="@string/iv_icon"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="20dp"
android:scaleType="fitXY"
/>
<TextView
android:tag="@string/tv_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="20dp"
android:gravity="center_vertical"
android:textColor="#000"
android:textSize="20sp"
android:textStyle="italic"
/>
</LinearLayout>
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">
<com.example.pxd19qqlist.qq_listView
android:id="@+id/lv_qqList"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
在values中的strings有定义两个tag值
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
上一篇: java 中继承和多态详细介绍
推荐阅读
-
Android的ListView,使用封装和MVC的设计模式
-
Android OkHttp的简单使用和封装详解
-
【Android】Retrofit+RxJava+OkHttp的基础、封装和项目中的使用
-
android ListView和ProgressBar(进度条控件)的使用方法
-
Android开发中的MVC设计模式浅析
-
jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门
-
android ListView和ProgressBar(进度条控件)的使用方法
-
Ruby中使用设计模式中的简单工厂模式和工厂方法模式
-
Android开发中的MVC设计模式浅析
-
MVC设计模式带来更好的软件结构和代码重用(转) 设计模式MVC数据结构软件测试企业应用