Android MVP模式ListView中嵌入checkBox的使用方法

MVP模式 ListView中嵌入checkBox的使用

本文写的是一个小demo,如何在ListView中嵌入checkBox配合使用,本篇文章与前面的嵌入Button类似,同样的采用MVP模式的写代码,本次案例中会有几个小细节,我将会在案例中介绍。

程序基本框架如下:

View层:

MainActivity.java

public class MainActivity extends AppCompatActivity implements ViewInter<MyBean>{
  //ListView的控件名
  private ListView mList;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mList = (ListView)findViewById(R.id.mList);
    //开始向presenter层请求数据
    new Presenter(this).load();
  }
  /**
  * presenter层将数据通过接口回调把数据传递给这个方法
  * 通过这个方法可以将数据项传递给适配器
  */
  @Override
  public void showData(List<MyBean> myBeen) {
    MyAdapter adapter = new MyAdapter(myBeen);
    mList.setAdapter(adapter);
  }
}

ViewInter.java

/**
*  view层所有的界面更新,请求数据等功能都写在此接口,方便扩展
*/
public interface ViewInter<T> {
  void showData(List<T> t);
}

Presenter层:

Presenter.java

public class Presenter {
  //view层的对象,主要调用其子类自身的方法,然后回传数据
  ViewInter<MyBean> vi;
  //model层的对象,主要调用其子类功能,实现数据获取
  ModelInter mi;
  /**
  * 只需要传递view层的引用即可,model层的数据其由自身去处理
  */
  public Presenter(ViewInter<MyBean> vi){
    this.vi = vi;
    mi = new ModelImp();
  }
  /**
  * 该方法的主要功能就是负责数据的传递和通知处理数据
  */
  public void load(){
    //调用mi.getData方法,可以获取需要的数据,然后回调给view层
    mi.getData(new ModelInter.DealData() {
      @Override
      public void setData() {
        List<MyBean> data = new ArrayList<>();
        for(int i = 0; i < 10; i++){
          MyBean bean = new MyBean();
          //这里是随机生成实体类中的数据,也就是设置复选框是否默认为选上状态
          bean.setChecked(Math.random() > 0.5 ? true : false);
          data.add(bean);
        }
        //回调传递数据
        vi.showData(data);
      }
    });
  }
}

Model层:

ModelInter.java

/**
* 所有模型层的功能都可以写在此接口中,此接口方便扩展新功能
*/
public interface ModelInter {
  void getData(DealData dealData);
  public interface DealData{
    void setData();
  }
}

ModelImp.java

public class ModelImp implements ModelInter{
  /**
  * 实现数据的处理,方法中的参数是一个接口类型,所有传递过来的值都必须实现其定义的方法
  */
  @Override
  public void getData(DealData dealData) {
    dealData.setData();
  }
}

Adapter.java

public class MyAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener {
  //定义一个类似于map集合的对象,其效率会比map更高,用来保存复选框当前被用户点击后的状态
  private SparseArray<Boolean> array;
  private Context context;
  private List<MyBean> data;

  public MyAdapter(List<MyBean> data) {
    this.data = data;
    array = new SparseArray();
  }

  @Override
  public int getCount() {
    return data == null ? 0 : data.size();
  }

  @Override
  public Object getItem(int i) {
    return data.get(i);
  }

  @Override
  public long getItemId(int i) {
    return i;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    MyBean bean = data.get(position);
    if (context == null)
      context = parent.getContext();
    ViewHolder holder = null;
    if (convertView == null) {
      convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, null);
      holder = new ViewHolder();
      holder.mTv = (TextView) convertView.findViewById(R.id.mTv);
      holder.mCheck = (CheckBox) convertView.findViewById(R.id.mCheck);
      convertView.setTag(holder);
    }
    holder = (ViewHolder) convertView.getTag();
    holder.mTv.setText("复选框" + position);
    //设置复选框的监听事件
    holder.mCheck.setOnCheckedChangeListener(this);
    holder.mCheck.setText("编程" + position);
    //将对应位置设置到tag中
    holder.mCheck.setTag(R.id.check, position);
    //首先判断数据项中的数据是否为true,如果为true则设置其默认值
    // if(data.get(position).isChecked()) //已注释
    //  holder.mCheck.setChecked(data.get(position).isChecked());//已注释
    //将用户选择的状态保存到对应的item复选框上
    // holder.mCheck.setChecked(array.get(position, false));//已注释
    return convertView;
  }

  @Override
  public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    //每次触发事件的时候,都拿到对应item位置的值
    // int i = (int) compoundButton.getTag(R.id.check);//已注释
    //然后将状态保存到集合中
    // array.put(i, b);//已注释
    //并且修改数据项的值。
    // data.get(i).setChecked(b);//已注释
  }

  static class ViewHolder {
    TextView mTv;
    CheckBox mCheck;
  }
}

MyBean.java

//数据项对象
public class MyBean {
  boolean isChecked;

  public boolean isChecked() {
    return isChecked;
  }

  public void setChecked(boolean checked) {
    isChecked = checked;
  }
}

基本的代码都已经实现,我们来看看如果缺少MyAdapter.java中的getView方法中的注释的代码所产生的运行效果图:

从这个运行效果来看,我们明显可以看出一下小BUG,一开始的时候复选框都是没有选中,当我们自己选中第一个复选框的时候,我们往下拖动的时候,你会看到,复选框7明显也跟着被选上了,当我们在此选中复选框2的时候,复选框8也随之选中了,那么这是什么原因呢,这是因为在ListView的一个复用控件机制导致的,关于此问题,本博客中前面的基础已经讲解原理,本案例中就不做详细讲解。

最后我们看下取消那些注释的代码后的运行结果图:

从这个运行结果可以看到,由于默认数据选择的是1 、 2 、5 当我们取消1、2选择0时,下面的复用组件就不会想上面的运行结果一样被复用了,这样才是正常的选择了,想选择就选择,想取消就取消。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android开发:浅谈MVP模式应用与内存泄漏问题解决

    最近博主开始在项目中实践MVP模式,却意外发现内存泄漏比较严重,但却很少人谈到这个问题,促使了本文的发布,本文假设读者已了解MVP架构. MVP简介 M-Modle,数据,逻辑操作层,数据获取,数据持久化保存.比如网络操作,数据库操作 V-View,界面展示层,Android中的具体体现为Activity,Fragment P-Presenter,中介者,连接Modle,View层,同时持有modle引用和view接口引用 示例代码 Modle层操作 public class TestModle

  • 完整的Android MVP开发之旅

    开发背景 最近是在做一个与健身相关的APP,里面有训练器模块基本功能是按照特点动作的演示和描述来引导用户完成训练.在第一个版本时由于没接触过些类项目与功能花了几周的时间大概1500行代码才完成这个功能, 当时虽然我已经尽量让代码表现的清晰,但是可以想像到当一个Activity中包含这么多代码是什么感觉.自己维护起来都难受. 先谈设计 有了前一次设计经验此次开发使用MVP.模块化.面向接口等概念,将整个训练器分为控制器.数据模型.音频.视图.可训练对象五个模块分别用以下接口表示: ITrainer

  • Android如何从实现到封装一个MVP详解

    前言 MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.下面这篇文章主要给大家介绍了关于Android从实现到封装MVP的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. MVP之间的联系 大概简单的解释就是M->module处理数据,V->Act显示界面,P->M和V沟通的渠道,即P用来将数据和界面联系到一起,这样子界面和数据就可以完全独立开来,Ac

  • Android MVP模式实战教程

    一.什么是MVP 在网上找了些资料,整理如下: MVP是模型(Model).视图(View).主持人(Presenter)的缩写,分别代表项目中3个不同的模块. 模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等: 视图(View):负责界面数据的展示,与用户进行交互: 主持人(Presenter):相当于协调者,是模型与视图之间的桥梁,将模型与视图分离开来. 如下图所示,View与Model并不直接交互,而是使用Presenter作为View与Model之间的桥梁

  • 详解Android MVP开发模式

    本文主要讲解MVP开发模式以及具体实例. 一.简介 MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了.初看起来我们会感觉增加了很多类接口代码看起来更加清晰. MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.不过MVP不是一个结构化的模式,它只是负责显示层而已,任何时候都可以在自

  • 详解MVP模式在Android开发中的应用

    一.MVP介绍  随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生. 在MVP模式里通常包含4个要素: (1)View:负责绘制UI元素.与用户进行交互(在Android中体现为Activity); (2)View interface:需要View实现的接口,Vie

  • Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller. 在MVC里,View是可以直接访问

  • 浅谈Android官方MVP架构解读

    综述 对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的.而对于Android应用的开发中本身可视为一种MVC架构.通常在开发中将XML文件视为MVC中的View角色,而将Activity则视为MVC中的Controller角色.不过更多情况下在实际应用开发中Activity不能够完全充当Controller,而是Controller和View的合体.于是Activity既要负责视图的显示,又要负责对业务逻辑的

  • 详解Android中的MVP架构分解和实现

    1.概述 传统的Android开发架构一般是MVC模式, Model:业务逻辑和实体模型 View:对应于布局文件 Controllor:对应于Activity 单独从逻辑看起来非常好,与我们做Web开发时,开发模式类似,但在实际开发中,View对应于布局文件,实际上关于该布局文件中的数据绑定的操作,事件处理的代码都在Activity中,Activity既像View又像Controller(MVVP架构中包括数据绑定),导致Activity中职责太重,耦合度大.修改和维护起来非常麻烦. 2.MV

  • Android MVP模式ListView中嵌入checkBox的使用方法

    MVP模式 ListView中嵌入checkBox的使用 本文写的是一个小demo,如何在ListView中嵌入checkBox配合使用,本篇文章与前面的嵌入Button类似,同样的采用MVP模式的写代码,本次案例中会有几个小细节,我将会在案例中介绍. 程序基本框架如下: View层: MainActivity.java public class MainActivity extends AppCompatActivity implements ViewInter<MyBean>{ //Lis

  • Android编程之listView中checkbox用法实例分析

    本文实例讲述了Android编程之listView中checkbox用法.分享给大家供大家参考,具体如下: 我们经常会用到在listView中使用checkbox的情况.直接不回应用后会发现,ListView中的OnItemClickListener事件会和checkbox中的选择事件发生冲突,这个怎么处理呢.直接上代码. list_item.xml代码: <?xml version="1.0" encoding="utf-8"?> <Relati

  • Android编程实现ListView中item部分区域添加点击事件功能

    本文实例讲述了Android编程实现ListView中item部分区域添加点击事件功能.分享给大家供大家参考,具体如下: 需求如题目:Android listview中item部分区域添加点击事件,在一个界面显示了listview,但显示的内容分为上下两部分,分别是白色的背景和蓝色的背景,现在需要只点击蓝色的背景,才能跳转到其他界面,解决方式如下: 一开始想着是不是能在list item的布局给上层布局添加一个: android:clickable="false" android:fo

  • Android编程实现ListView内容无限循环显示的方法

    本文实例讲述了Android编程实现ListView内容无限循环显示的方法.分享给大家供大家参考,具体如下: 其实要达到无限循环显示,主要就是实现继承Adapter的类. 我这里用到的是BaseAdapter private class MyAdapter extends BaseAdapter{ private Context context; private String[] strs = null; LayoutInflater inflater = null; public MyAdap

  • Android开发实现ListView异步加载数据的方法详解

    本文实例讲述了Android开发实现ListView异步加载数据的方法.分享给大家供大家参考,具体如下: 1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayList<Person> persons; private ListAdapter adapter; private Handler handler=null; //xml文件的网络地址 final

  • Go语言中嵌入C语言的方法

    本文实例讲述了Go语言中嵌入C语言的方法.分享给大家供大家参考.具体分析如下: Go语言官方带了一个工具叫cgo,可以很方便的在Go语言代码中内嵌C代码或做C和Go代码的集成.下面是一段简单的在Go中内嵌C的实验代码: 复制代码 代码如下: package main /* #include <stdio.h> #include <stdlib.h> void say_hello() {         printf("Hello World!\n"); } */

  • Android实现在ServiceManager中加入自定义服务的方法详解

    本文实例讲述了Android实现在ServiceManager中加入自定义服务的方法.分享给大家供大家参考,具体如下: 当我们要使用android的系统服务时,一般都是使用Context.getSystemService方法.例如我们要获取AudioManager,我们可以: AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 获取的服务,其实是在ServiceManager中注册的Binder服务,

  • Android开发实现ListView部分布局监听的方法

    本文实例讲述了Android开发实现ListView部分布局监听的方法.分享给大家供大家参考,具体如下: android listview 部分布局监听,很多人会想,直接在适配器里面,拿到那个布局,添加点击事件就可以了,不过我会告诉你的是这时候position是错乱的,是无法根据用户点击的位置来对每个item进行相应的逻辑操作.  同事给我想到的一个办法是:给每个布局提前设置一个tag,也就是绑定对应需要设置的数据,在点击事件的时候,会有一个view,根据该view重新拿到这个tag,取得里面的

  • iOS汇编入门教程之在Xcode工程中嵌入汇编代码的方法

    简介 上一篇文章ARM64汇编基础中介绍了汇编在iOS开发中的应用以及ARM汇编基础知识,本文将介绍在C或Objective-C构成的工程中如何嵌入汇编代码. 注意 在调试ARM汇编时,Xcode的Build对象必须为真机,如果对象为模拟器则是x86汇编. 内联汇编 汇编与C间接通信 在函数中可以直接插入汇编代码来影响函数的运行逻辑,使用的语法为编译指令 __asm__ ,注意插入汇编有可能会被编译器忽略,因此需要加入 __volatile__ 修饰符保证汇编代码有效. 下面给出一个简单的例子,

随机推荐