1.基础知识
- ListView(UITableView);只能纵向滚动显示
- 具体的显示给Adapter来配置
- 1.创建ListView :xml 代码创建
- 2.配置数据 创建一个类继承于baseAdapter
- 3.设置ListView的适配器(数据)
- 4.创建layout 布局具体样式
- 使用View.Inflate 解析layout布局文件->View
- 5.响应用户的点击事件setOnItemClickListener(new AdapterView.OnItemClickListener()
- 6.注意 :每行显示的内容通常是用layout.xml配置文件
2.所求目标及思维导图
目标:先就自己构造数据库来完成一个qq列表功能
思维导图:
3.详细代码
1.activity_main.xml(用自己创的View,灵活性高)
2.layout_qq_friend.xml(实现界面的构造)
3.MainActivity(由于xml里面用的自定义View ,这里十分简洁)
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
4.HSLlistView extends ListView(对ListView进行封装以及设置适配器)
public class HSLlistView extends ListView {
public HSLlistView(Context context) {
super(context);
initDate();
}
private void initDate() {
//设置适配器
setAdapter(new MyAdapter());
}
public HSLlistView(Context context, AttributeSet attrs) {
super(context, attrs);
initDate();
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return DataManager.shareManager.getDataSource().size();
}
@Override
public Object getItem(int position) {
return DataManager.shareManager.getDataSource().get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
//获取这个item对应的数据模型
FriendModel model = DataManager.shareManager
.getDataSource()
.get(position);
//创建管理Item的对象
Frienditem item = new Frienditem(
getContext(),
model);
return item.rootView;
}
}
}
5.FriendModel(好友列表的设置)
public class FriendModel {
public int iconID;//头像资源id
public String name;//昵称
public FriendModel(int iconID, String name) {
this.iconID = iconID;
this.name = name;
}
}
6.Frienditem(封装让好友列表的内容种类好修改)
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;
}
}
7.DataUtils(类方法 实现自己构造数据、 本地加载(文件)、数据库加载、网络加载,这里只用了自己构造的数据)
- 类方法:如果只关心方法本身
工具类里面的方法基本上都是类方法(静态)
- 对象方法:如果有数据需要对象存储
public class DataUtils {
/**
* 自己构造数据
*/
public static ArrayList loadCustomDate(){
ArrayListfriends=new ArrayList<>();
for (int i = 0; i < 30; i++) {
FriendModel model=new FriendModel(R.drawable.icon,"yy");
//保存数据
friends.add(model);
}
return friends;
}
/**
* 本地加载(文件)
*/
public static Object loadFromFile(){
return null;
}
/**
* 数据库加载
*/
public static Object loadFromSQL(){
return null ;
}
/**
* 网络加载
*/
public static Object loadFromServer(){
return null;
}
}
8. DataManager
- 管理数据
- 存储解析之后的数据
- 加载数据
- 保存数据
- 更改数据
为了安全性用单例模式
- 1、禁用构造方法
- 2、定义单例对象 静态 final
public class DataManager {
//保存所有数据
private ArrayListdataSource;
//单例对象
public static final DataManager shareManager=new DataManager();
//禁用构造方法
private DataManager(){
loadData();
}
//加载数据
public void loadData(){
//用自己创建假数据的方式加载所有数据
dataSource=DataUtils.loadCustomDate();
}
public ArrayList getDataSource() {
return dataSource;
}
}
9.CircleImageView(为了让qq列表头像变为圆形封装的类)
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) {
//1.创建裁剪需要的形状的路径Path
Path path=new Path();
path.addCircle(getPivotX(),getPivotY(),getWidth()/2, Path.Direction.CCW);
//2.裁剪
canvas.clipPath(path);
super.draw(canvas);
}
}
4.大体效果
5.总结:
今天的demo很有意义,难度也不大,意识到要好好地掌握