ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-如何将复选框绑定到列表视图

2019-10-12 09:27:52  阅读:232  来源: 互联网

标签:android listview simplecursoradapter android-viewbinder


我有一个列表视图,在每一行上都包含一个带有复选框的文本视图,因此当选中该复选框并且我们在列表视图中向下滚动时,该复选框实例将从一个地方移到另一个地方(重用..),我还选中了几个复选框要解决我试图将复选框绑定到列表视图但无法正常工作的问题,我的代码是:

 SimpleCursorAdapter adapter =new SimpleCursorAdapter(this,R.layout.rating,cu,new String[]{"Title","Favorites"}, new int[]{R.id.text1,R.id.bt_rating},CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        listv.setAdapter(adapter);

        adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder(){
               /** Binds the Cursor column defined by the specified index to the specified view */
               public boolean setViewValue(View view, Cursor cursor, int columnIndex){
                   if(view.getId() == R.id.bt_rating){

                      ((CheckBox)view).setChecked(Boolean.valueOf(cursor.getString(cursor.getColumnIndex("Favorites"))));
                      ((CheckBox)view).setOnCheckedChangeListener(myCheckChangList);
                       return true; //true because the data was bound to the view
                   }
                   return false;
               }
            });


 OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                 buttonView.setChecked(isChecked);
            }
        };

我的listview行内容的xml代码是:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

  <CheckBox
 android:id="@+id/bt_rating"
 android:focusable="false"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center_vertical"
 android:button="@android:drawable/btn_star"/>

<TextView

android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/fsinlistview"

 />
</LinearLayout>

解决方法:

看来您的OnCheckedChangedListener是这里的问题.如果您查看代码,则可以看到每个复选框都引用了同一侦听器.因此,当您选中一个框时,也将所有其他框都设置为选中状态-而且您也不会更新后备数据.

您的OnCheckedChangedListener不应更新复选框的视图状态-触发回调是因为状态已经更改.

因此,当用户选中复选框时,您需要执行以下步骤:

>找出已检查的项目,以及该项目如何与您的数据对应
>更新您的数据以适应新的选中/未选中状态
>通知适配器数据更改/更新光标

您可以执行以下操作,用其表示的行的ID标记视图:

public boolean setViewValue(View view, Cursor cursor, int columnIndex){
    if(view.getId() == R.id.bt_rating){
        view.setTag(cursor.getInt(cursor.getColumnIndex(SomeDBContract.ID)));
        ((CheckBox)view).setChecked(Boolean.valueOf(cursor.getString(cursor.getColumnIndex("Favorites"))));
        ((CheckBox)view).setOnCheckedChangeListener(myCheckChangList);
        return true; //true because the data was bound to the view
    }
    return false;
}

然后,您可以在侦听器中根据该ID更新数据库:

CheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
             int rowId = (int) buttonView.getTag();
             // Handle updating the database as per normal
             updateSomeDbRowAsChecked(rowId, isChecked);
        }
    };

最后,一旦数据库行更新,您将需要使用新的游标更新游标适配器:

 myAdapter.swapCursor(newCursor);

您必须对所有这些进行调整以适合您的代码,但这应该使您对解决此问题的一种方式有所了解.

标签:android,listview,simplecursoradapter,android-viewbinder
来源: https://codeday.me/bug/20191012/1899212.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有