Android Нажмите на listiTem проверить неправильный флажок

StackOverflow https://stackoverflow.com/questions/4010623

Вопрос

Я создал пользовательский список, расширяя SimpleCursorAdapter. Результатом является изображение + CheckedTextView (Text + Checkbox).

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

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

Например: У меня есть 9 предметов в моем списке, отсортировали 1-9. Если я нажму на listiTem 1, флажок в строке 9 проверяется. Если я нажму на элемент 4, флажок в строке 6 проверяется, и если я нажму на среднюю строку, она проверяется.

Ясно, что я что-то упускаю здесь :) Помните, когда я долго щелкнул строчку (Contextmenu открывается), все работает отлично.

Это слушатель:

lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle);

                if (!markedItem.isChecked()) {
                    markedItem.setChecked(true);
                } else {
                    markedItem.setChecked(false);
                }

            }
        });

Цените любую помощь!

Дайте мне знать, если вам нужно, чтобы я позволил больше кода.

Спасибо!

Кстати, если я нажму на более чем один ... вечеринка продолжается ... Нет очевидного порядка ...

Редактировать: код адаптера

public class ImageCursorAdapter extends SimpleCursorAdapter {

    private Cursor c;
    private Context context;

    private String url;
    private TextView bUrl;

    public ImageCursorAdapter(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;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.image_list, null);
        }

        this.c.moveToPosition(pos);

        final TextView bTitle = (TextView) v.findViewById(R.id.btitle);
        String bookmark = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.TITLE));


        byte[] favicon = this.c.getBlob(this.c.getColumnIndex(Browser.BookmarkColumns.FAVICON));

        if (favicon != null) {
            ImageView iv = (ImageView) v.findViewById(R.id.bimage);
            iv.setImageBitmap(BitmapFactory.decodeByteArray(favicon, 0, favicon.length));
        }
        bTitle.setText(bookmark);

        return (v);
    }
}
Это было полезно?

Решение

MAYRA правильно - проблема связана с тем, как ListView воспроизводит ваши взгляды. Это не так, как будто есть 9 экземпляров CheckedTextView объект, один за вид. Вместо этого есть один, который повторно используется во всех рядах. Таким образом, вы не можете полагаться на объект CheckedTextView для удержания состояния того, проверяется ли элемент. Вам понадобится дополнительная структура данных для проведения, проверяется ли данную строку, например,

ArrayList<Boolean> checkedStates = new ArrayList<Boolean>();

Где ith элемент правдивый IFF ith ряд должен быть проверен. Затем в вашем itemClickListener:

lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            boolean currentlyChecked = checkedStates.get(position);
            checkedStates.set(position, !currentlyChecked);
            // Refresh the list
        }
    });

Затем в рамках вашего просмотра:

public View getView(int pos, View inView, ViewGroup parent) {
    View v = inView;
    if (v == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.image_list, null);
    }

    this.c.moveToPosition(pos);

    final TextView bTitle = (TextView) v.findViewById(R.id.btitle);
    String bookmark = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.TITLE));


    byte[] favicon = this.c.getBlob(this.c.getColumnIndex(Browser.BookmarkColumns.FAVICON));

    if (favicon != null) {
        ImageView iv = (ImageView) v.findViewById(R.id.bimage);
        iv.setImageBitmap(BitmapFactory.decodeByteArray(favicon, 0, favicon.length));
    }
    bTitle.setText(bookmark);


    // Change the state of the checkbox to match that of the row's checked state.
    // This check box item is reused for every row, so we need to reset its state each
    // time the row is rendered.
    CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle);
    markedItem.setChecked(checkedStates.get(pos));


    return (v);
}

Это должно решить вашу проблему. Альтернативный подход будет перемещать логику того, проверяется ли строка или нет в объект домена, который представляет ряд. Это было бы моими предпочтениями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top