ToggleButton обновляется для всех элементов ListView - PullRequest
0 голосов
/ 26 марта 2019

У меня есть ListView, который состоит из ToggleButton для каждой строки. Это ToggleButton в основном кнопка избранного. Сначала я захожу в базу данных и проверяю, существует ли конкретное значение, если да, я отображаю кнопку красным или серым. Проблема заключается в том, что всякий раз, когда я нажимаю на любую кнопку, все кнопки становятся красными или наоборот, и по умолчанию также при прокрутке обновляются все кнопки. Код моего адаптера:

public class PostAdapter extends ArrayAdapter<PostModel> {
    Drawable mDrawable;
    ViewHolder viewHolder;

    public PostAdapter(Context context, ArrayList<PostModel> objects) {
        super(context, 0, objects);
    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        //Get the date item for this position
        final PostModel postModel = getItem(position);
        boolean isClicked = false;

        //Check if the existing view is being reused, otherwise inflate a new view from custom_row layout
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.custom_row, parent, false);
            viewHolder = new ViewHolder();
            //Casting of views from the custom_row layout
            viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
            viewHolder.tvPost = (TextView) convertView.findViewById(R.id.tvPost);
            viewHolder.imageIcon = (ImageView) convertView.findViewById(R.id.imageIcon);
            viewHolder.toggleButton = (ToggleButton) convertView.findViewById(R.id.myHeartToggleButton);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        //Filling each views values
        viewHolder.tvTitle.setText(postModel.getTitle());
        viewHolder.tvPost.setText(postModel.getPost());
        viewHolder.imageIcon.setImageResource(postModel.getAssociatedDrawable());

        final DBHelper dbHelper = new DBHelper(getContext().getApplicationContext());
        dbHelper.open();

        if (dbHelper.isClickedPost(postModel.getTitle())) {
            Drawable mDrawable = ContextCompat.getDrawable(getContext().getApplicationContext(), R.drawable.favorite_icon);
            mDrawable.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_IN));
            viewHolder.toggleButton.setBackgroundDrawable(mDrawable);
            isClicked = true;
        } else {
            viewHolder.toggleButton.setBackgroundDrawable(ContextCompat.getDrawable(getContext().getApplicationContext(), R.drawable.favorite_icon));
        }

        final boolean finalIsClicked = isClicked;

        viewHolder.toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    if (!finalIsClicked) {
                        Toast.makeText(getContext().getApplicationContext(), "Clicked.", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getContext().getApplicationContext(), "Clicked again.", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(getContext().getApplicationContext(), "Hello...", Toast.LENGTH_SHORT).show();
                }
            }
        });

        return convertView;
    }

    static class ViewHolder {
        TextView tvTitle, tvPost;
        ImageView imageIcon;
        ToggleButton toggleButton;
    }
}

1 Ответ

0 голосов
/ 27 марта 2019

Первый:

Вы должны поместить toggleButton внутри viewHolder. Как это:

static class ViewHolder {
    TextView tvTitle, tvPost;
    ImageView imageIcon;
    ToggleButton toggleButton;
}

Затем измените эту строку:

toggleButton = (ToggleButton) convertView.findViewById(R.id.myHeartToggleButton);

Кому:

viewHolder.toggleButton = (ToggleButton) convertView.findViewById(R.id.myHeartToggleButton);

Также в других местах вместо toggleButton используйте viewHolder.toggleButton.

Еще одна вещь, на которую следует обратить внимание, это то, что isClicked также не следует размещать внутри адаптера, поскольку он содержит разные значения для каждой строки.

...