Android: не отмечен флажок во время прокрутки списка - PullRequest
0 голосов
/ 12 января 2019

У меня есть ListView с CheckBox внутри. Я нажал несколько флажков и все еще прокручивал - отлично, пока я не решил прокрутить назад. В настоящее время выбранные флажки не проверяются, а другие, которые не были отмечены, выбраны. Я думаю, что в моем коде есть какая-то ошибка, пожалуйста, помогите мне! С этого момента я благодарю вас! После кода:

public class TableListAdapter extends
ArrayAdapter<String>
{
    private Context context;
    private int layoutId;
    private String[] numbers;
    private int btnColorId;
    public boolean[] listIsChecked;
    char activityOperation;


    int pos;

    public TableListAdapter(Context context, int layoutId, 
     String[] numbers, int btnColorId, char activityOperation)
    {
        super(context, layoutId, numbers);
        this.context = context;
        this.layoutId = layoutId;
        this.numbers = numbers;
        this.btnColorId = btnColorId;
        this.activityOperation = activityOperation;

        listIsChecked = new boolean[numbers.length];
    }

    @Override
    public View getView(int position, View view, ViewGroup parent)
    {
        Holder holder;
        pos = position;

        if (view == null)
        {
            holder = new Holder();
            view = LayoutInflater.from(context).inflate(layoutId, null);

            holder.image = (ImageView) view.findViewById(R.id.practice_list_itemImageView);
            holder.button = (Button) view.findViewById(R.id.practice_list_itemButton);
            holder.checkbox = (CheckBox) view.findViewById(R.id.practice_list_itemCheckBox);
        view.setTag(holder);
        }
        else
        {
            holder = (Holder) view.getTag();
        }


                holder.image.setImageResource(R.drawable.ic_launcher);
        holder.button.setText(numbers[position]);
            holder.button.setBackgroundResource(btnColorId);

              holder.checkbox.setChecked(listIsChecked[position]);

     holder.checkbox.setOnClickListener(new CheckBox.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            listIsChecked[pos] = ((CheckBox)v).isChecked();
        }
    });

    holder.button.setOnClickListener(new Button.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Intent intent = new Intent(context, ShowTableActivity.class);
            intent.putExtra("activityOperation", activityOperation);
            intent.putExtra("number", pos);
            context.startActivity(intent);
        }
    });

    return view;
}

class Holder
{
    ImageView image;
    Button button;
    CheckBox checkbox;
}
}









<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/practice_list_item_auxiliar"
android:gravity="center">

<Button
    android:id="@+id/practice_list_itemButton"
    android:textSize="@dimen/main_button_text"
    android:textStyle="bold"
    android:layout_width="0dp"
    android:layout_height="70dp"
    android:layout_weight="3"
    android:textColor="@android:color/white"
    android:padding="@dimen/main_button_padding"/>

<ImageView
    android:id="@+id/practice_list_itemImageView"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="wrap_content"/>

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:orientation="vertical"
    android:gravity="center">
    <CheckBox
        android:id="@+id/practice_list_itemCheckBox"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>







 public class MainPracticeActivity  extends Activity
 {
String[] nums = {"1","2","3","4","5","6","7", "8", "9", "10"};
ListView lv;
char activityOperation;

ImageButton imageButtonLinkeable;
ImageButton imageButtonChoiceable;
ImageButton imageButtonTypeable;
ImageButton buttons[] = new ImageButton[3];

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_practice);

    activityOperation = getIntent().getCharExtra("activityOperation", '0');

    lv = (ListView) findViewById(R.id.main_practice_ListView);
    TableListAdapter tbl = new TableListAdapter
    (this, R.layout.practice_list_item, nums, getMainColor(activityOperation), activityOperation);
    lv.setAdapter(tbl);

    imageButtonLinkeable = (ImageButton)findViewById(R.id.main_practice_imagebutton_linkable);
    imageButtonChoiceable = (ImageButton)
            findViewById(R.id.main_practice_imagebutton_choiceable);
    imageButtonTypeable = (ImageButton)
            findViewById(R.id.main_practice_imagebutton_typeable);
    buttons[0] = imageButtonLinkeable;
    buttons[1] = imageButtonChoiceable;
    buttons[2] = imageButtonTypeable;

    //Set the default drawable resources to the game's buttons
    unselectButtons(buttons);

    //ImageButtons
    imageButtonLinkeable.setOnClickListener(new ImageButton.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            unselectButtons(buttons);
            selectButton(v);
        }
    });

    imageButtonChoiceable.setOnClickListener(new ImageButton.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            unselectButtons(buttons);
            selectButton(v);
        }
    });

    imageButtonTypeable.setOnClickListener(new ImageButton.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            unselectButtons(buttons);
            selectButton(v);
        }
    });
}

private int getMainColor(char activityOperation)
{
    int colorId = -1;

    switch(activityOperation)
    {
        case '+':
            colorId = R.color.add;
            break;

        case '-':
            colorId = R.color.subtract;
            break;

        case '*':
            colorId = R.color.multiply;
            break;

        case '/':
            colorId = R.color.divide;
            break;
    }
    return colorId;
}

private int getSelectedBackground(char activityOperation)
{
    int backgroundId = -1;

    switch(activityOperation)
    {
        case '+':
            backgroundId = R.drawable.circle_button_add_selected;
            break;

        case '-':
            backgroundId = R.drawable.circle_button_subtract_selected;
            break;

        case '*':
            backgroundId = R.drawable.circle_button_multiply_selected;
            break;

        case '/':
            backgroundId = R.drawable.circle_button_divide_selected;
            break;
    }
    return backgroundId;
}

private int getDefaultBackground(char activityOperation)
{
    int backgroundId = -1;

    switch(activityOperation)
    {
        case '+':
            backgroundId = R.drawable.circle_button_add_default;
            break;

        case '-':
            backgroundId = R.drawable.circle_button_subtract_default;
            break;

        case '*':
            backgroundId = R.drawable.circle_button_multiply_default;
            break;

        case '/':
            backgroundId = R.drawable.circle_button_divide_default;
            break;
    }
    return backgroundId;
}

private void unselectButtons(View...buttons)
{
    for(View cb : buttons)
    {
        ((ImageButton)cb).setBackgroundResource(getDefaultBackground(
        activityOperation));
    }
}

private void selectButton(View button)
{
    ((ImageButton)button).setBackgroundResource
    (getSelectedBackground(activityOperation));
}
 }

1 Ответ

0 голосов
/ 12 января 2019

Я думаю, что проблема может быть в переменной pos, которую вы используете внутри прослушивателя щелчков CheckBox.

Представьте, что getView() вызывается для позиции 0, затем для позиции 1, затем для позиции 2 и т. Д. (Достаточно, чтобы заполнить список всеми видимыми позициями). Как только это сделано, pos равно (скажем) 10. Что происходит, когда вы нажимаете CheckBox в позиции 3? Я верю, что вы настроитесь на listIsChecked[10] = true.

Вам следует избавиться от переменной pos и просто использовать аргумент position, передаваемый getView(). Вы можете сделать это final, если компилятор говорит, что не может использовать неконечную переменную в прослушивателе щелчков.

@Override
public View getView(final int position, View view, ViewGroup parent)
{
    // ...

    holder.checkbox.setOnClickListener(new CheckBox.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            listIsChecked[position] = ((CheckBox)v).isChecked();
        }
    });

    // ...
}
...