Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在ListView-CursorAdapter中,当开关离开屏幕时,它会自动切换_Android_Listview_Switch Statement_Android Cursoradapter_Recycle - Fatal编程技术网

Android 在ListView-CursorAdapter中,当开关离开屏幕时,它会自动切换

Android 在ListView-CursorAdapter中,当开关离开屏幕时,它会自动切换,android,listview,switch-statement,android-cursoradapter,recycle,Android,Listview,Switch Statement,Android Cursoradapter,Recycle,我很难弄明白这一点 我有一个带有光标或适配器的列表视图,如果项目离开屏幕,开关会自动重置它。我在交换机上设置了一个监听器onCheckedChangeListener,它触发通过托管更新数据库表中的字段并重新查询整个内容(contentResolver.notifyChange())的片段实现的监听器 我知道这是复选框的常见问题,但我仍然无法让它工作 public class FilterCursorAdapter extends CursorAdapter { public inte

我很难弄明白这一点

我有一个带有光标或适配器的列表视图,如果项目离开屏幕,开关会自动重置它。我在交换机上设置了一个监听器onCheckedChangeListener,它触发通过托管更新数据库表中的字段并重新查询整个内容(contentResolver.notifyChange())的片段实现的监听器

我知道这是复选框的常见问题,但我仍然无法让它工作

public class FilterCursorAdapter extends CursorAdapter {

    public interface OnSwitchToggledListener {
        public void onSwitchToggled(int id, boolean isActivated);
    }

    private OnSwitchToggledListener listener;

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View view = layoutInflater.inflate(R.layout.filter_item, parent, false);

        ViewHolder holder = new ViewHolder();
        holder.keywordTextView = (TextView) view.findViewById(R.id.keyword_text_view);
        holder.cathegoryTextView = (TextView) view.findViewById(R.id.cathegory_text_view);
        holder.activateSwitch = (Switch) view.findViewById(R.id.switch_activate);
        view.setTag(holder);

        return view;

    }


    public void bindView(View row, final Context context, final Cursor cursor) {
        final ViewHolder holder = (ViewHolder) row.getTag();

        holder.keywordTextView.setText(cursor.getString(cursor.getColumnIndex(ArticleProvider.COLUMN_KEYOWRD)));

        final int id = cursor.getInt(cursor.getColumnIndex(ArticleProvider.COLUMN_FILTER_ID));
        String cathegory = cursor.getString(cursor.getColumnIndex(ArticleProvider.COLUMN_CATHEGORY));
        int isActivated = cursor.getInt(cursor.getColumnIndex(ArticleProvider.COLUMN_ACTIVATED));

        holder.cathegoryTextView.setText(string);
        holder.activateSwitch.setChecked(isActivated == 1);
        holder.activateSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    listener.onSwitchToggled(id, isChecked);
                }

        });
    }

     private class ViewHolder {

        public TextView keywordTextView;
        public TextView cathegoryTextView;
        public Switch activateSwitch;

    }

}

public class FilterListFragment extends SherlockListFragment implements LoaderCallbacks<Cursor>, OnSwitchToggledListener {

    @Override
    public void onSwitchToggled(int id, boolean isActivated) {
        Log.d(MainActivity.TAG, "ID: " + id + " isActivated: " + isActivated);

        ContentValues values = new ContentValues();
        values.put(ArticleProvider.COLUMN_ACTIVATED, isActivated);
        resolver.update(ArticleProvider.FILTERS_URI, values, ArticleProvider.COLUMN_FILTER_ID + "=" + id, null);

    }
}
公共类过滤器CursorAdapter扩展了CursorAdapter{
公共接口OnSwitchToggledListener{
切换时的公共无效(int-id,布尔值被激活);
}
专用OnSwitchToggledListener侦听器;
@凌驾
公共视图newView(上下文上下文、光标、视图组父对象){
视图=布局更平坦。充气(R.layout.filter_项,父项,false);
ViewHolder=新的ViewHolder();
holder.keywordTextView=(TextView)view.findViewById(R.id.keyword\u text\u视图);
holder.cathegoryTextView=(TextView)view.findViewById(R.id.cathegory\u text\u视图);
holder.activateSwitch=(开关)视图.findViewById(R.id.Switch\u activate);
视图.设置标签(支架);
返回视图;
}
公共void bindView(视图行、最终上下文上下文、最终光标){
final ViewHolder=(ViewHolder)row.getTag();
holder.keywordTextView.setText(cursor.getString(cursor.getColumnIndex(ArticleProvider.COLUMN_KEYOWRD));
final int id=cursor.getInt(cursor.getColumnIndex(ArticleProvider.COLUMN_FILTER_id));
String cathegory=cursor.getString(cursor.getColumnIndex(ArticleProvider.COLUMN_cathegory));
int isActivated=cursor.getInt(cursor.getColumnIndex(ArticleProvider.COLUMN_ACTIVATED));
holder.cathegoryTextView.setText(字符串);
holder.activateSwitch.setChecked(isActivated==1);
holder.activateSwitch.setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
listener.onSwitchToggled(id,isChecked);
}
});
}
私有类视窗持有者{
公共文本视图关键字文本视图;
公共文本视图cathegoryTextView;
公共开关激活开关;
}
}
公共类FilterListFragment扩展SherlockListFragment实现LoaderCallbacks,OnSwitchToggledListener{
@凌驾
已切换的公共无效(整数id,布尔值已激活){
Log.d(MainActivity.TAG,“ID:+ID+”已激活:+isActivated);
ContentValues=新的ContentValues();
value.put(ArticleProvider.COLUMN_激活,isActivated);
更新(ArticleProvider.FILTERS\u URI,值,ArticleProvider.COLUMN\u FILTER\u ID+“=”+ID,null);
}
}
从日志中可以看出,bindView中的setOnCheckedChangeListener监听器本身被触发

我怎么修这个?我还想指出,我使用的是SwitchCompatLibrary()


谢谢

如果遇到此问题,则需要在重新设置侦听器之前添加或删除侦听器

holder.activateSwitch.setOnCheckedChangeListener(null)

今天大约三个小时我都有同样的问题。一旦它离开屏幕,它就改变了。因此,我最终放弃了
onCheckedChanged
侦听器,而是使用:

mySwitch.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       Log.i(TAG, "isChecked:");
    }
});
现在它工作得很好