Day13ListView的应用:实现qq列表,注重模块化

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列表功能
思维导图:
image.png

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.大体效果

image.png

5.总结:

今天的demo很有意义,难度也不大,意识到要好好地掌握

你可能感兴趣的:(Day13ListView的应用:实现qq列表,注重模块化)