0

我無法解決這個問題。當在ListView中關閉屏幕時,開關會自行切換 - CursorAdapter

我有一個帶有CursorAdapter的ListView,如果項目離開屏幕,交換機重置它自我。我在交換機上設置了一個監聽器CheckedChangeListener,該監聽器通過託管片段來更新數據庫表中的字段並重新查詢整個事件(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); 

    } 
} 

從日誌中,似乎裏面bindView的setOnCheckedChangeListener聽衆被它引發的自我。

我該如何解決這個問題?另外我想說明的是,我正在使用SwitchCompatLibrary(https://github.com/ankri/SwitchCompatLibrary

謝謝!

回答

1

如果你面臨這樣的問題,您需要添加再設置

holder.activateSwitch.setOnCheckedChangeListener(null) 
0

我是有這個同樣的問題,今天大約三個小時之前刪除監聽器。一旦它從屏幕上移開,它就會改變。所以,我最終放棄了onCheckedChanged聽衆,而是使用:

mySwitch.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.i(TAG, "isChecked:"); 
    } 
}); 

現在它運行完美。