Android, как перерисовать список, когда пользователь ставит галочку?

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

Я могу сгенерировать список, но не знаю, почему метод onListItemClick() не работает? поэтому я не знаю, какой флажок установлен.

И мой следующий вопрос: как я могу перерисовать список после установки флажка пользователем?

мой код:

    package com.Infindo.DRM;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;

public class Infindo_PackageActivity extends ListActivity {

    private final String[] titels = {"Try before buy", "Pay per play", "Pay per day", "Pay per week", "Pay per month", "Daily subscription", "Weekly subscription", "Monthly subscription"};
    private final String[] descriptions = {"Free of charge", "Price: $1.00", "Price: $5.00", "Price: $10.00", "Price: $30.00", "Price: $5.00", "Price: $10.00", "Price: $30.00"};
    private String[] flag = {"false", "false", "false", "false", "false", "false", "false", "false"};
    private ListAdapter listAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.infindo_packagepage);

        listAdapter = new ListAdapter(this);
        setListAdapter(listAdapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Log.i("List Clicked:", "******");
    }

    public void onCheckboxClicked(View v){
        int i = getSelectedItemPosition();
        Log.i("item pos:", String.valueOf(i)); // every time the result is -1???
    }


    //*********************
    //  RowModel Class
    //*********************
    private class RowModel{
        TextView title;
        TextView description;
        CheckBox checkbox;
    }

    //*********************
    //  ListAdapter Class
    //*********************
    private class ListAdapter extends ArrayAdapter<String>{

        public ListAdapter(Context c) {
            super(c, R.layout.infindo_listformat, titels);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            RowModel holder;
            View row = convertView;

            if(row == null){
                LayoutInflater inflater = getLayoutInflater();
                row = inflater.inflate(R.layout.infindo_listformat, parent, false);

                holder = new RowModel();
                holder.title = (TextView) row.findViewById(R.id.title);
                holder.description = (TextView) row.findViewById(R.id.description); 
                holder.checkbox = (CheckBox) row.findViewById(R.id.checkbox);

                row.setTag(holder);

            } else {
                holder = (RowModel) row.getTag(); 
            }

            holder.title.setText(titels[position]);
            holder.description.setText(descriptions[position]);
            String s = flag[position];
            if(s.equalsIgnoreCase("false")) 
                holder.checkbox.setChecked(false);
            else
                holder.checkbox.setChecked(true);

            return(row);
        }
    }
}

Обновление: я добавил

@Override
        public void notifyDataSetChanged() {
            super.notifyDataSetChanged();
            Log.i("List Redrawed:", "**notifyDataSetChanged()**");
        }

в мой класс адаптера списка и вызвал его в

public void onCheckboxClicked(View v){
        int i = getSelectedItemPosition();
        Log.i("item pos:", String.valueOf(i)); // every time the result is -1???
        listAdapter.notifyDataSetChanged();
    }

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


person Hesam    schedule 30.11.2011    source источник


Ответы (2)


Вы можете использовать setOnCheckedChangeListener, чтобы узнать, какой флажок был установлен. Полный пример ListView с CheckBox можно посмотреть здесь.

ОБНОВЛЕНИЕ

Чтобы ваша onListItemClick() работала, вам нужно написать android:focusable="false" для других элементов ListView, потому что из-за фокуса других представлений onListItemClick() ListView не работает должным образом.

Ознакомьтесь с этим ответом, почему пользовательский ListView Android не может нажимать на элементы

person Lalit Poptani    schedule 30.11.2011
comment
Спасибо, дорогой Лалит, я видел эту ссылку раньше, и она очень полезна. Но мой код правильный, как и тот, который вы предложили. Просто я не знаю, почему onListItemClick () не запускается в моем коде, а будет работать в их коде. Я несколько раз проверил и сравнил свой код с их кодом, и все вроде нормально, но этот метод не работает в моем коде. это мой вопрос, почему? - person Hesam; 30.11.2011
comment
да, потому что вам нужно добавить android: focusable = false в другие представления в элементах ListView, тогда щелчок по элементу listview будет работать для вас. - person Lalit Poptani; 30.11.2011
comment
спасибо дорогой Лалит. Ты прав. Я добавил эту строку кода ко всем элементам строки, и проблема была решена. Теперь onListItemClick () работает нормально, хотя я не знаю, в чем причина (ы)? - person Hesam; 30.11.2011
comment
Что ж, вы должны знать причину, прочтите ссылку, которую я вам дал, она вам также поможет в будущем. Спасибо. - person Lalit Poptani; 30.11.2011

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

person dhaag23    schedule 30.11.2011
comment
Да, но в этой ситуации пользователь должен установить флажок. но если пользователь щелкнет строку вместо флажка, ничего не произойдет. Возможно, это не важно, но на самом деле мне нужно знать, какой флажок установлен. Я думаю, мне нужно знать, каково это место в списке. Я пытался найти его в onCheckboxClicked (), но для всех флажков результат -1. Я так запуталась и не знаю, в чем и где мои ошибки? - person Hesam; 30.11.2011