ListView от курсора с флажком - PullRequest
2 голосов
/ 03 января 2011

У меня есть Listview, который выглядит следующим образом:

флажок: textview {0 .. n}

У меня есть OnCheckChangedListener, который прослушивает изменения флажка (флажок имеет фокусируемое значение false, как рекомендовано http://www.mousetech.com/blog/?p=74).

Нужное мне поведение заключается в том, что пользователи могут установить флажок, чтобы установить его состояние, и могут щелкнуть элемент списка, чтобы получить описание.

В настоящее время состояние флажка сохраняется правильно, и если вы щелкнете по элементу, то отобразится описание. Однако если вы сначала измените состояние, а затем нажмете, чтобы получить описание, флажок вернется к предыдущему состоянию. Фактически все флажки возвращаются к предыдущему состоянию.

Кто-нибудь знает, как я могу заставить это работать?

Спасибо.

***** EDIT ********

SimpleCursorAdapter adapter = 
    new SimpleCursorAdapter(this,
        R.layout.listview_item, 
        cursor, 
        new String[] {MyContentColumns.NAME, MyContentColumns.MyBoolean }, 
        new int[] {R.id.listview_item_title,R.id.listview_item_myBoolean });

adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
    @Override
    public boolean setViewValue(View view, Cursor cursor,int columnIndex) {
        String c_name = cursor.getColumnName(columnIndex);
        if (c_name.equals(MyContentColumns.NAME)) {
            // set up name and description of listview
            MyContent v = mycontent.getMyContent(cursor.getString(columnIndex));
            if (view instanceof TextView) {
                TextView tv = (TextView) view;
                if (tv.getId() == R.id.listview_item_title) {
                    tv.setText(v.getLongName());
                }
            }
            return true;
        } else if (c_name.equals(MyContentColumns.MyBoolean)) {
            // if myBoolean == 0, box is checked
            // if myBoolean == 1, box is unchecked
            int myBoolean = cursor.getInt((cursor.getColumnIndex(MyContentColumns.MyBoolean)));
            final String myCont_name = cursor.getString(cursor.getColumnIndex(MyContentColumns.NAME));
            final String myCont_cid = cursor.getString(cursor.getColumnIndex(MyContentColumns.CONTENT_ID));
            final long c_id = cursor.getLong(cursor.getColumnIndex(MyContentColumns._ID));

            if (view instanceof CheckBox) {
                ((CheckBox) view).setChecked(myBoolean == 1);
                ((CheckBox) view)
                        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                            @Override
                            public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                                ContentValues values = new ContentValues();
                                values.put(MyContentColumns.MyBoolean,isChecked ? 1 : 0);
                                int rows = getContentResolver()
                                .update(
                                        ContentUris.withAppendedId(Uri.withAppendedPath(MyContentColumns.CONTENT_URI,"mycontent"),c_id),
                                        values,
                                        null,
                                        null);
                                if ( rows == 0) {
                                    Logger.wLog(String
                                            .format("Couldn't update values for %s into db for content %d",
                                                    myCont_name, myCont_cid));
                                }
                            }
                        });
            }
            return true;
        }
        return false;
    }
});

Так что, похоже, что нажатие на один элемент списка приводит к тому, что другие элементы списка также щелкаются ... поэтому значения возвращаются, и мои состояния становятся противоречивыми ... идеи? спасибо.

Ответы [ 3 ]

0 голосов
/ 06 января 2011
 boolean[] itemChecked =  new boolean[100];     

public View getView(int pos, View inView, ViewGroup parent) {



System.out.println("  ImageCursorAdapter : getView : ");
View v = inView;
    // Associate the xml file for each row with the view
if (v == null) {
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.main, null);
}
this.c.moveToPosition(pos);

    final CheckBox checkBox = (CheckBox) v.findViewById(R.id.bcheck);


checkBox.setTag(pos);

checkBox.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {



    String position = (String) checkBox.getTag();

    if (checkBox.isChecked() == true) {

        itemChecked[Integer.valueOf(position)] = checkBox.isChecked();  

    } else {

        itemChecked[Integer.valueOf(position)] = checkBox.isChecked();  

    }



    }

});

checkBox.setChecked(itemChecked[pos]); 

return (v);

}
0 голосов
/ 09 января 2011

Так что мне удалось это исправить, вызвав cursor.requery (), когда был вызван мой слушатель чекбокса. Не уверен, что это хороший метод, но он работает.

0 голосов
/ 04 января 2011

декалирует глобальный логический массив и сохраняет в нем состояние чека

public class CheckBoxAdapter extends SimpleCursorAdapter {

    private Cursor c;
    private Context context;


  private boolean[] itemChecked =  new boolean[100]; 


 public CheckBoxAdapter (Context context, int layout, Cursor c,
        String[] from, int[] to) 
{
    super(context, layout, c, from, to);

    this.c = c;
    this.context = context;
    }



  public View getView(int pos, View inView, ViewGroup parent) {

    View v = inView;

   final CheckBox checkBox = (CheckBox) v.findViewById(R.id.bcheck);

   checkBox.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
if (checkBox.isChecked() == true) {
 itemChecked[Integer.valueOf(position)] = checkBox.isChecked();  
}
else{
 itemChecked[Integer.valueOf(position)] = checkBox.isChecked();  

}
}
});

    checkBox.setChecked(itemChecked[pos]); 

}//end of getView method



}//end of class CheckBoxAdapter 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...