以上图片用作今日项目图片,仅供参考
一、目的
今天来正式的写一写QQ好友列表的简单实现,不再像之前那样将程序的所有功能全写在一个文件里。
二、知识点
1.ListView和自定义适配器搭配使用
public class MainActivity extends AppCompatActivity {
ListView listView;
ArrayList friends;
MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.lv);
friends = new ArrayList<>();
//设置行与行之间的间距
listView.setDividerHeight(100);
//设置高度
//listView.setMinimumHeight(100);
//设置适配器
mAdapter = new MyAdapter();
//定义数据适配器
public class MyAdapter extends BaseAdapter{
//配置listView显示多少行
@Override
public int getCount() {
return friends.size();
}
//数据源:数组->所有的数据 所有的好友信息
//获取数据源里面position行对应的数据
@Override
public Object getItem(int position) {
return null;
}
//获取position位置对应的id
//id就是这一行对应的索引值
@Override
public long getItemId(int position) {
return position;
}
//配置每行显示什么内容
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//将一个layout.xml文件转化为对应的视图
//LinearLayout -> ViewGroup -> View
View v = View.inflate(getApplicationContext(),
R.layout.layout_qq_friend,
null);
return v;
}
}
}
2.设计模式
2.1MVC
3.对象方法与类方法的选择
区别 | 对象方法 | 类方法(静态方法) |
---|---|---|
是否需要创建对象 | 需要创建该类的对象才能调用该方法 | (static)直接调用 |
e.g创建时 | Object loadFromSever(){return null;} | public static Object loadCustomData(){return null;} |
使用时 | DataUtil dataUtil = new DataUtil();dataUtil.loadFromSever(); | DataUtil.loadCustomData(); |
适用于 | 有数据需要对象存储 | 只关心这个方法本身 |
4.如何将照片设置为头像时显示圆内内容
尝试1:drawable 里配置 .xml文件,结果达不到效果。
最终:新建一个javaclass:CircleImageView来解决的
使其继承于ImageView,最后再layout_qq_friend.xml文件里配置
三、实际应用
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
以下.java文件均是在与MainActivity.java同一目录下创建
DataUtil.java:
public class DataUtil {//加载数据
/**
* 自己构造数据
*/
public static Object loadCustomData(){
ArrayList friends = new ArrayList<>();
for(int i = 0; i < 20; i++){
//创建模型对象
FriendModel friendModel = new FriendModel(
R.drawable.tu1,"Echo"
);
//保存
friends.add(friendModel);
}
return friends;
}
/**
*本地加载(文件)
*/
public static Object loadFromFile(){
return null;
}
/**
*数据库加载
*/
public static Object loadFromSQL(){
return null;
}
/**
*网络加载
*/
public static Object loadFromSever(){
return null;
}
}
FriendModel.java
public class FriendModel {
public int iconID;//头像资源id
public String name;//呢称/备注
public FriendModel(int iconID, String name) {
this.iconID = iconID;
this.name = name;
}
}
FriendItem.java:
public class FriendItem {
//这个item的数据模型
private FriendModel model;
//这个item对应的视图
public View rootView;
//
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.iconTag));
TextView name = v.findViewWithTag(context.getResources().getString(R.string.nameTag));
//显示数据
icon.setImageResource(model.iconID);
name.setText(model.name);
rootView = v;
}
}
MyListView.java:
public class MyListView extends ListView {
public MyListView(Context context) {
super(context);
initData();
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
initData();
}
private void initData(){
//设置适配器
setAdapter(new MyAdapter());
}
public class MyAdapter extends BaseAdapter {
@Override
public int getCount() {//配置listView显示多少行
return DataManager.sharedManager.getDataSource().size();
}
@Override
public Object getItem(int position) {//获取position位置的数据
return DataManager.sharedManager.getDataSource().get(position);
}
@Override
public long getItemId(int position) {//获取对应的位置的id,有时候显得多余却有特殊之用
return position;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
//获取item对应的数据模型,model就是好友信息即是icon和name
FriendModel model = DataManager.sharedManager.getDataSource().get(position);
//创建管理item的对象
FriendItem item = new FriendItem(getContext(),model);
return item.rootView;
}
}
}
CircleImageView .java:
public class CircleImageView extends AppCompatImageView {
public CircleImageView(Context context) {
super(context);
}
public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void draw(Canvas canvas) {
//创建裁剪路径
Path path = new Path();
path.addCircle(getPivotX(),getPivotY(),getWidth()/2, Path.Direction.CCW);
//裁剪
canvas.clipPath(path);
super.draw(canvas);
}
}
DataManager.java:
public class DataManager {
//禁用构造方法
private DataManager(){
loadData();
}
//单例对象 饿汉式
public static final DataManager sharedManager = new DataManager();
//保存所有数据
private ArrayList dataSource;
public ArrayList getDataSource() {
return dataSource;
}
//加载数据
private void loadData(){
//构造假数据
dataSource = (ArrayList) DataUtil.loadCustomData();
}
}
activity_main.xml
layout_qq_friend.xml 在res->layout新建的resource文件
四、心得
这次项目可以说是很正式了,各个模块负责各自的功能,具体的功能又交给各个class去实现。把这个项目写熟了,理解其中真意(ps:有点难度),那么你就很ok了。