Когда я пытаюсь использовать ArrayList и StringBuffer в методе OnClick, студия Android хочет, чтобы я изменил их на final. Но когда я это сделаю, я смогу сохранить только последний вставленный элемент в ArrayList.

SharedPreferences sp = mContext.getSharedPreferences("checked",Context.MODE_PRIVATE);
        final SharedPreferences.Editor e=sp.edit();
        final ArrayList<Integer> sharedP= new ArrayList<>();

        final String word = words.get(position).getMean();
        final int id= words.get(position).getId();
        final StringBuffer str= new StringBuffer("");

        holder.rowText.setText(word);
        holder.rowText.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (holder.rowText.isChecked()) {

                    sharedP.remove(sharedP.indexOf(id));
                    holder.rowText.setCheckMarkDrawable(null);
                    holder.rowText.setChecked(false);
                } else {

                    sharedP.add(id);
                    holder.rowText.setCheckMarkDrawable(R.drawable.ic_check_black_24dp);
                    holder.rowText.setChecked(true);

                }

                for(int i=0;i<sharedP.size();i++){
                    Log.e("sharedpreference1",sharedP.get(i).toString());
                    str.append(sharedP.get(i));

                }

                e.putString("str", str.toString());
                e.commit();

            }

        });


Обновленный код

SharedPreferences sp = mContext.getSharedPreferences("checked",Context.MODE_PRIVATE);

        e=sp.edit();
        sharedP= new ArrayList<>();
        word = words.get(position).getMean();
        Log.e("getMean",word);
        id= words.get(position).getId();
        str= new StringBuffer("");

        holder.rowText.setText(word);
        holder.rowText.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (holder.rowText.isChecked()) {

                    sharedP.remove(sharedP.indexOf(word));
                    flag=false;

                    holder.rowText.setCheckMarkDrawable(null);
                    holder.rowText.setChecked(false);
                } else {

                    sharedP.add(word);
                    flag=true;
                    Log.e("deneme",word);
                    holder.rowText.setCheckMarkDrawable(R.drawable.ic_check_black_24dp);
                    holder.rowText.setChecked(true);

                }

                str.delete(0,str.length());
                for(int i=0;i<sharedP.size();i++){
                    Log.e("sharedpreference1",sharedP.get(i).toString());
                    str.append(sharedP.get(i));
                    str.append(".");

                }
                if(flag==false){
                    e.remove("str");
                    e.commit();
                }
                Log.e("size",str.toString());
                e.putString("str", str.toString());
                e.remove("set");

                e.commit();

            }

        });

Но он по-прежнему возвращает последний элемент массива

пример checkedTextView

общие предпочтения

-1
kestane 20 Дек 2019 в 17:41

2 ответа

Вы должны объявить свои переменные вне этого метода.

private SharedPreferences.Editor e;
private ArrayList<Integer> sharedP= new ArrayList<>();
private String word = null;
private int id= 0;
private StringBuffer str = null;

Затем:

e=sp.edit();
sharedP= new ArrayList<>();
word = words.get(position).getMean();
id= words.get(position).getId();
str= new StringBuffer("");
0
Nico 20 Дек 2019 в 18:09
Он работает, спасибо, но он по-прежнему возвращает последний элемент массива
 – 
kestane
20 Дек 2019 в 21:17
1
Вероятно, вы не хотите, чтобы id был глобальным, иначе он будет перезаписываться каждый раз, когда вы его создаете. Он должен находиться в правильной области действия функции, или вам нужно сохранить его где-нибудь, чтобы onClickHandler мог получить к нему доступ, например, как атрибут объекта rowText.
 – 
J. Allen
20 Дек 2019 в 21:36

Объявите Arraylist и String Buffer как глобальные переменные.

private ArrayList<Integer> sharedP = new ArrayList<>();
private StringBuffer str = new StringBuffer("");
0
Saugat Jonchhen 20 Дек 2019 в 18:10