CursorAdapter в списке

я использую CursorAdapter для чтения базы данных в виде списка. у меня есть флажок в каждом элементе списка, который, когда флажок установлен пользователем, любимый столбец в моей базе данных изменяет да, и элемент добавляется в избранное.

все в порядке, и избранный столбец изменился, но когда я прокручиваю список вверх и вниз, флажок снимается. и если вы перезапустите приложение, флажок будет установлен

что мне делать с этой проблемой:

Извините за мой плохой английский:

Класс CursorAdapter:

public class MyAdapter extends CursorAdapter {

    Context b;   
    LayoutInflater inflater;
    @SuppressWarnings("deprecation")
    public MyAdapter(Context context, Cursor c) {
        super(context, c);
        inflater = LayoutInflater.from(context);
        b= (Context) context;
    }

    @SuppressWarnings("unused")
    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
        // TODO Auto-generated method stub

        TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
        TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);

        tv1.setText(cursor.getString(2));
        tv2.setText(cursor.getString(3));

        final int pos = cursor.getPosition();

        final CheckBox repeatChkBx = (CheckBox)view.findViewById(R.id.favorite_check);

        String me = cursor.getString(cursor.getColumnIndex("like"));

        if (me.equals("yes")) {
            repeatChkBx.setChecked(true);
        } else {
            repeatChkBx.setChecked(false);
        }

        repeatChkBx.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                MyDatabase MyDatabase = new MyDatabase(b);
                SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
                cursor.moveToPosition(pos);

                if (repeatChkBx.isChecked()) {                   
                    mydb.execSQL("update list set like = 'yes' where id = " + cursor.getString(1));

                }else{
                    mydb.execSQL("update list set like = 'no' where id = " + cursor.getString(1));           

                }
            }
        });

        }

        protected Context getActivity() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            return inflater.inflate(R.layout.item, parent, false);
        }
    }

скриншот:

введите здесь описание изображения


person hamedjj    schedule 17.05.2014    source источник
comment
есть кто ответит на этот вопрос   -  person hamedjj    schedule 18.05.2014
comment
возможный дубликат Останов анимации элементов списка во время прокрутки   -  person Mojtabye    schedule 26.05.2014
comment
возможный дубликат Listview с CursorAdapter   -  person Devrim    schedule 27.05.2014
comment
проблема в том, что ListView не знает, какой именно элемент щелкнул, вы можете сделать это с помощью setTag и getTag для каждого элемента   -  person Mehrdad Faraji    schedule 12.03.2015


Ответы (3)


проблема заключается в том, что когда вы обновляете свою базу данных, будет обновляться только база данных, а не курсор, который адаптирует ваш адаптер курсора, поэтому вам нужно использовать

 changeCursor(newcursor);

в вашем адаптере после обновления базы данных. надеюсь, это поможет вам.

person max    schedule 13.05.2015

Проверенные предметы не перерабатываются. Вы должны сохранить проверенные элементы в какой-то массив - динамический или статический. Логический массив хорошо подходит для этой цели.

Boolean[] myCheckedItems = new Boolean[SIZE];
person Björn Hallström    schedule 26.05.2014

Я бы использовал listAdapter для реализации использования множественного выбора в ListView. Создайте следующую модель, которая содержит имя и информацию, если этот элемент выбран в данный момент.

Сначала создайте класс модели:

public class Model {

    private String name;
    private boolean selected;

    public Model(String name) {
        this.name = name;
        selected = false;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }

} 

Создайте следующий XML-файл в папке layouts:

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

<TextView
    android:id="@+id/label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@+id/label"
    android:textSize="30px" >
</TextView>

<CheckBox
    android:id="@+id/check"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_marginLeft="4px"
    android:layout_marginRight="10px" >
</CheckBox>
</RelativeLayout> 

Создайте следующий адаптер. Этот адаптер добавляет прослушиватель в представлении Checkbox. Если флажок установлен, базовые данные модели изменяются. Флажок получает соответствующий элемент модели, назначенный с помощью метода getTag().

import java.util.List;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

public class InteractiveArrayAdapter extends ArrayAdapter<Model> {

    private final List<Model> list;
    private final Activity context;

    public InteractiveArrayAdapter(Activity context, List<Model> list) {
        super(context, R.layout.rowbuttonlayout, list);
        this.context = context;
        this.list = list;
    }

    static class ViewHolder {
        protected TextView text;
        protected CheckBox checkbox;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.rowbuttonlayout, null);
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.text = (TextView) view.findViewById(R.id.label);
            viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
            viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          Model element = (Model) viewHolder.checkbox.getTag();
          element.setSelected(buttonView.isChecked());

          }
        });
        view.setTag(viewHolder);
        viewHolder.checkbox.setTag(list.get(position));
        } else {
            view = convertView;
            ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(list.get(position).getName());
        holder.checkbox.setChecked(list.get(position).isSelected());
    return view;
    }
}

В конце вам нужно изменить свою деятельность на следующее:

import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class MyList extends ListActivity {

/** Called when the activity is first created. */
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    // create an array of Strings, that will be put to our ListActivity
    ArrayAdapter<Model> adapter = new InteractiveArrayAdapter(this, getModel());
    setListAdapter(adapter);
}

private List<Model> getModel() {
    List<Model> list = new ArrayList<Model>();
    //The following elements need to be changed by your elements.
    list.add(get("List number 1"));
    list.add(get("List number 2"));
    list.add(get("List number 3"));
    list.add(get("List number 4"));
    list.add(get("List number 5"));
    list.add(get("List number 6"));

    // Initially select one of the items
    list.get(1).setSelected(true);
    return list;
}

private Model get(String s) {
      return new Model(s);
}

}

person Michele La Ferla    schedule 27.05.2014