Android MVP模式ListView中嵌入checkBox的使用方法
MVP模式 ListView中嵌入checkBox的使用
本文寫的是一個小demo,如何在ListView中嵌入checkBox配合使用,本篇文章與前面的嵌入Button類似,同樣的采用MVP模式的寫代碼,本次案例中會有幾個小細節(jié),我將會在案例中介紹。
程序基本框架如下:

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層請求數(shù)據(jù)
new Presenter(this).load();
}
/**
* presenter層將數(shù)據(jù)通過接口回調(diào)把數(shù)據(jù)傳遞給這個方法
* 通過這個方法可以將數(shù)據(jù)項傳遞給適配器
*/
@Override
public void showData(List<MyBean> myBeen) {
MyAdapter adapter = new MyAdapter(myBeen);
mList.setAdapter(adapter);
}
}
ViewInter.java
/**
* view層所有的界面更新,請求數(shù)據(jù)等功能都寫在此接口,方便擴展
*/
public interface ViewInter<T> {
void showData(List<T> t);
}
Presenter層:
Presenter.java
public class Presenter {
//view層的對象,主要調(diào)用其子類自身的方法,然后回傳數(shù)據(jù)
ViewInter<MyBean> vi;
//model層的對象,主要調(diào)用其子類功能,實現(xiàn)數(shù)據(jù)獲取
ModelInter mi;
/**
* 只需要傳遞view層的引用即可,model層的數(shù)據(jù)其由自身去處理
*/
public Presenter(ViewInter<MyBean> vi){
this.vi = vi;
mi = new ModelImp();
}
/**
* 該方法的主要功能就是負責(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();
//這里是隨機生成實體類中的數(shù)據(jù),也就是設(shè)置復(fù)選框是否默認為選上狀態(tài)
bean.setChecked(Math.random() > 0.5 ? true : false);
data.add(bean);
}
//回調(diào)傳遞數(shù)據(jù)
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{
/**
* 實現(xiàn)數(shù)據(jù)的處理,方法中的參數(shù)是一個接口類型,所有傳遞過來的值都必須實現(xiàn)其定義的方法
*/
@Override
public void getData(DealData dealData) {
dealData.setData();
}
}
Adapter.java
public class MyAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener {
//定義一個類似于map集合的對象,其效率會比map更高,用來保存復(fù)選框當(dāng)前被用戶點擊后的狀態(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)聽事件
holder.mCheck.setOnCheckedChangeListener(this);
holder.mCheck.setText("編程" + position);
//將對應(yīng)位置設(shè)置到tag中
holder.mCheck.setTag(R.id.check, position);
//首先判斷數(shù)據(jù)項中的數(shù)據(jù)是否為true,如果為true則設(shè)置其默認值
// if(data.get(position).isChecked()) //已注釋
// holder.mCheck.setChecked(data.get(position).isChecked());//已注釋
//將用戶選擇的狀態(tài)保存到對應(yīng)的item復(fù)選框上
// holder.mCheck.setChecked(array.get(position, false));//已注釋
return convertView;
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//每次觸發(fā)事件的時候,都拿到對應(yīng)item位置的值
// int i = (int) compoundButton.getTag(R.id.check);//已注釋
//然后將狀態(tài)保存到集合中
// array.put(i, b);//已注釋
//并且修改數(shù)據(jù)項的值。
// data.get(i).setChecked(b);//已注釋
}
static class ViewHolder {
TextView mTv;
CheckBox mCheck;
}
}
MyBean.java
//數(shù)據(jù)項對象
public class MyBean {
boolean isChecked;
public boolean isChecked() {
return isChecked;
}
public void setChecked(boolean checked) {
isChecked = checked;
}
}
基本的代碼都已經(jīng)實現(xiàn),我們來看看如果缺少MyAdapter.java中的getView方法中的注釋的代碼所產(chǎn)生的運行效果圖:

從這個運行效果來看,我們明顯可以看出一下小BUG,一開始的時候復(fù)選框都是沒有選中,當(dāng)我們自己選中第一個復(fù)選框的時候,我們往下拖動的時候,你會看到,復(fù)選框7明顯也跟著被選上了,當(dāng)我們在此選中復(fù)選框2的時候,復(fù)選框8也隨之選中了,那么這是什么原因呢,這是因為在ListView的一個復(fù)用控件機制導(dǎo)致的,關(guān)于此問題,本博客中前面的基礎(chǔ)已經(jīng)講解原理,本案例中就不做詳細講解。
最后我們看下取消那些注釋的代碼后的運行結(jié)果圖:

從這個運行結(jié)果可以看到,由于默認數(shù)據(jù)選擇的是1 、 2 、5 當(dāng)我們?nèi)∠?、2選擇0時,下面的復(fù)用組件就不會想上面的運行結(jié)果一樣被復(fù)用了,這樣才是正常的選擇了,想選擇就選擇,想取消就取消。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android App數(shù)據(jù)格式Json解析方法和常見問題
JSON數(shù)據(jù)格式,在Android中被廣泛運用于客戶端和網(wǎng)絡(luò)(或者說服務(wù)器)通信,非常有必要系統(tǒng)的了解學(xué)習(xí)。恰逢本人最近對json做了一個簡單的學(xué)習(xí),特此總結(jié)一下,以饗各位2014-03-03
Android 給RecyclerView添加分割線的具體步驟(分享)
下面小編就為大家?guī)硪黄狝ndroid 給RecyclerView添加分割線的具體步驟(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Android簡單實現(xiàn)一個顏色漸變的ProgressBar的方法
本篇文章主要介紹了Android簡單實現(xiàn)一個顏色漸變的ProgressBar的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Android WebView userAgent 設(shè)置為桌面UA實例
這篇文章主要介紹了Android WebView userAgent 設(shè)置為桌面UA實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android?Flutter中Offstage組件的使用教程詳解
這篇文章主要為大家詳細介紹了Android?Flutter中Offstage組件的使用教程,文中的示例代碼講解詳細,對我們了解Flutter有一定的幫助,需要的可以參考一下2023-02-02
Android開發(fā)實現(xiàn)調(diào)節(jié)屏幕亮度功能
這篇文章主要介紹了Android開發(fā)實現(xiàn)調(diào)節(jié)屏幕亮度功能,涉及Android權(quán)限控制及屏幕亮度相關(guān)屬性操作技巧,需要的朋友可以參考下2018-03-03

