亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2016年08月18日 17:16:58   作者:qq_27630169  
這篇文章主要介紹了Android MVP模式ListView中嵌入checkBox的使用方法,如何在ListView中嵌入checkBox配合使用,感興趣的小伙伴們可以參考一下

MVP模式 ListView中嵌入checkBox的使用

本文寫(xiě)的是一個(gè)小demo,如何在ListView中嵌入checkBox配合使用,本篇文章與前面的嵌入Button類(lèi)似,同樣的采用MVP模式的寫(xiě)代碼,本次案例中會(huì)有幾個(gè)小細(xì)節(jié),我將會(huì)在案例中介紹。

程序基本框架如下:

這里寫(xiě)圖片描述

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);
    //開(kāi)始向presenter層請(qǐng)求數(shù)據(jù)
    new Presenter(this).load();
  }
  /**
  * presenter層將數(shù)據(jù)通過(guò)接口回調(diào)把數(shù)據(jù)傳遞給這個(gè)方法
  * 通過(guò)這個(gè)方法可以將數(shù)據(jù)項(xiàng)傳遞給適配器
  */
  @Override
  public void showData(List<MyBean> myBeen) {
    MyAdapter adapter = new MyAdapter(myBeen);
    mList.setAdapter(adapter);
  }
}

ViewInter.java

/**
*  view層所有的界面更新,請(qǐng)求數(shù)據(jù)等功能都寫(xiě)在此接口,方便擴(kuò)展
*/
public interface ViewInter<T> {
  void showData(List<T> t);
}

Presenter層:

Presenter.java

public class Presenter {
  //view層的對(duì)象,主要調(diào)用其子類(lèi)自身的方法,然后回傳數(shù)據(jù)
  ViewInter<MyBean> vi;
  //model層的對(duì)象,主要調(diào)用其子類(lèi)功能,實(shí)現(xiàn)數(shù)據(jù)獲取
  ModelInter mi;
  /**
  * 只需要傳遞view層的引用即可,model層的數(shù)據(jù)其由自身去處理
  */
  public Presenter(ViewInter<MyBean> vi){
    this.vi = vi;
    mi = new ModelImp();
  }
  /**
  * 該方法的主要功能就是負(fù)責(zé)數(shù)據(jù)的傳遞和通知處理數(shù)據(jù)
  */
  public void load(){
    //調(diào)用mi.getData方法,可以獲取需要的數(shù)據(jù),然后回調(diào)給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();
          //這里是隨機(jī)生成實(shí)體類(lèi)中的數(shù)據(jù),也就是設(shè)置復(fù)選框是否默認(rèn)為選上狀態(tài)
          bean.setChecked(Math.random() > 0.5 ? true : false);
          data.add(bean);
        }
        //回調(diào)傳遞數(shù)據(jù)
        vi.showData(data);
      }
    });
  }
}

Model層:

ModelInter.java

/**
* 所有模型層的功能都可以寫(xiě)在此接口中,此接口方便擴(kuò)展新功能
*/
public interface ModelInter {
  void getData(DealData dealData);
  public interface DealData{
    void setData();
  }
}

ModelImp.java

public class ModelImp implements ModelInter{
  /**
  * 實(shí)現(xiàn)數(shù)據(jù)的處理,方法中的參數(shù)是一個(gè)接口類(lèi)型,所有傳遞過(guò)來(lái)的值都必須實(shí)現(xiàn)其定義的方法
  */
  @Override
  public void getData(DealData dealData) {
    dealData.setData();
  }
}

Adapter.java

public class MyAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener {
  //定義一個(gè)類(lèi)似于map集合的對(duì)象,其效率會(huì)比map更高,用來(lái)保存復(fù)選框當(dāng)前被用戶點(diǎn)擊后的狀態(tài)
  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("復(fù)選框" + position);
    //設(shè)置復(fù)選框的監(jiān)聽(tīng)事件
    holder.mCheck.setOnCheckedChangeListener(this);
    holder.mCheck.setText("編程" + position);
    //將對(duì)應(yīng)位置設(shè)置到tag中
    holder.mCheck.setTag(R.id.check, position);
    //首先判斷數(shù)據(jù)項(xiàng)中的數(shù)據(jù)是否為true,如果為true則設(shè)置其默認(rèn)值
    // if(data.get(position).isChecked()) //已注釋
    //  holder.mCheck.setChecked(data.get(position).isChecked());//已注釋
    //將用戶選擇的狀態(tài)保存到對(duì)應(yīng)的item復(fù)選框上 
    // holder.mCheck.setChecked(array.get(position, false));//已注釋
    return convertView;
  }


  @Override
  public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    //每次觸發(fā)事件的時(shí)候,都拿到對(duì)應(yīng)item位置的值
    // int i = (int) compoundButton.getTag(R.id.check);//已注釋
    //然后將狀態(tài)保存到集合中
    // array.put(i, b);//已注釋
    //并且修改數(shù)據(jù)項(xiàng)的值。
    // data.get(i).setChecked(b);//已注釋
  }

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

MyBean.java

//數(shù)據(jù)項(xiàng)對(duì)象
public class MyBean {
  boolean isChecked;

  public boolean isChecked() {
    return isChecked;
  }

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

基本的代碼都已經(jīng)實(shí)現(xiàn),我們來(lái)看看如果缺少M(fèi)yAdapter.java中的getView方法中的注釋的代碼所產(chǎn)生的運(yùn)行效果圖:

這里寫(xiě)圖片描述

從這個(gè)運(yùn)行效果來(lái)看,我們明顯可以看出一下小BUG,一開(kāi)始的時(shí)候復(fù)選框都是沒(méi)有選中,當(dāng)我們自己選中第一個(gè)復(fù)選框的時(shí)候,我們往下拖動(dòng)的時(shí)候,你會(huì)看到,復(fù)選框7明顯也跟著被選上了,當(dāng)我們?cè)诖诉x中復(fù)選框2的時(shí)候,復(fù)選框8也隨之選中了,那么這是什么原因呢,這是因?yàn)樵贚istView的一個(gè)復(fù)用控件機(jī)制導(dǎo)致的,關(guān)于此問(wèn)題,本博客中前面的基礎(chǔ)已經(jīng)講解原理,本案例中就不做詳細(xì)講解。

最后我們看下取消那些注釋的代碼后的運(yùn)行結(jié)果圖:

這里寫(xiě)圖片描述

從這個(gè)運(yùn)行結(jié)果可以看到,由于默認(rèn)數(shù)據(jù)選擇的是1 、 2 、5 當(dāng)我們?nèi)∠?、2選擇0時(shí),下面的復(fù)用組件就不會(huì)想上面的運(yùn)行結(jié)果一樣被復(fù)用了,這樣才是正常的選擇了,想選擇就選擇,想取消就取消。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android App數(shù)據(jù)格式Json解析方法和常見(jiàn)問(wèn)題

    Android App數(shù)據(jù)格式Json解析方法和常見(jiàn)問(wèn)題

    JSON數(shù)據(jù)格式,在Android中被廣泛運(yùn)用于客戶端和網(wǎng)絡(luò)(或者說(shuō)服務(wù)器)通信,非常有必要系統(tǒng)的了解學(xué)習(xí)。恰逢本人最近對(duì)json做了一個(gè)簡(jiǎn)單的學(xué)習(xí),特此總結(jié)一下,以饗各位
    2014-03-03
  • Android 給RecyclerView添加分割線的具體步驟(分享)

    Android 給RecyclerView添加分割線的具體步驟(分享)

    下面小編就為大家?guī)?lái)一篇Android 給RecyclerView添加分割線的具體步驟(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Android 三種延遲操作的實(shí)現(xiàn)方法

    Android 三種延遲操作的實(shí)現(xiàn)方法

    這篇文章主要介紹了Android 延遲操作的實(shí)現(xiàn)方法的相關(guān)資料,這里提供了三種實(shí)現(xiàn)方法,希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • Android簡(jiǎn)單實(shí)現(xiàn)一個(gè)顏色漸變的ProgressBar的方法

    Android簡(jiǎn)單實(shí)現(xiàn)一個(gè)顏色漸變的ProgressBar的方法

    本篇文章主要介紹了Android簡(jiǎn)單實(shí)現(xiàn)一個(gè)顏色漸變的ProgressBar的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android WebView userAgent 設(shè)置為桌面UA實(shí)例

    Android WebView userAgent 設(shè)置為桌面UA實(shí)例

    這篇文章主要介紹了Android WebView userAgent 設(shè)置為桌面UA實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Android 10 適配攻略小結(jié)

    Android 10 適配攻略小結(jié)

    這篇文章主要介紹了Android 10 適配攻略小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Android?Flutter中Offstage組件的使用教程詳解

    Android?Flutter中Offstage組件的使用教程詳解

    這篇文章主要為大家詳細(xì)介紹了Android?Flutter中Offstage組件的使用教程,文中的示例代碼講解詳細(xì),對(duì)我們了解Flutter有一定的幫助,需要的可以參考一下
    2023-02-02
  • Android控件Gallery3D效果實(shí)例代碼

    Android控件Gallery3D效果實(shí)例代碼

    GalleryFlow中主要做了對(duì)圖片的旋轉(zhuǎn)和縮放操作,根據(jù)圖片的屏幕中的位置對(duì)其進(jìn)行旋轉(zhuǎn)縮放操作,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android中EditText禁止輸入表情的實(shí)例代碼

    Android中EditText禁止輸入表情的實(shí)例代碼

    本篇文章主要介紹了Android中EditText禁止輸入表情的實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • Android開(kāi)發(fā)實(shí)現(xiàn)調(diào)節(jié)屏幕亮度功能

    Android開(kāi)發(fā)實(shí)現(xiàn)調(diào)節(jié)屏幕亮度功能

    這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)調(diào)節(jié)屏幕亮度功能,涉及Android權(quán)限控制及屏幕亮度相關(guān)屬性操作技巧,需要的朋友可以參考下
    2018-03-03

最新評(píng)論