Как сохранить состояние при нажатии на элемент в Android Recycler - PullRequest
0 голосов
/ 09 мая 2019

Я создал recyclerView и обрабатываю элементы в нем, нажимая. Теперь мне нужно изменить текст, отображаемый при нажатии одного элемента. Сначала написано «день», а после того, как я щелкну по нему, должно появиться «готово». Это сработало, но после того, как я закрыл и снова открыл занятие, снова было написано «день». Итак, что мне нужно сделать, чтобы текст элемента сохранялся?

  private OnFragmentInteractionListener mListener;
    List<String> list;
    MyListAdapter adapter;
    RecyclerView recyclerView;
    String pressed="finished";
 public MainFragment() {
        // Required empty public constructor
    }

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView= inflater.inflate(R.layout.fragment_main, container, false);

        recyclerView=(RecyclerView)rootView.findViewById(R.id.item_list);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        list=new ArrayList<>();
        for(int i=1;i<50;i++){
            list.add("Day"+ i);
        }

        adapter =new MyListAdapter(getActivity(),list,this);
        recyclerView.setAdapter(adapter);


        return rootView;

    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    @Override
    public void onNoteClick(int position) {
        if (position == 0) {
            Log.d(TAG, "onNoteClick: ");
            list.set(0, "finished");
            adapter.getItemId(0);


            adapter.notifyItemChanged(0);
            adapter.notifyDataSetChanged();







            Fragment fr = new Day1();
            FragmentManager fm = getFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.replace(R.id.Mainfragment1, fr,null).addToBackStack(null);
            fragmentTransaction.commit();

        }

    }

И код адаптера

 Context context;
List<String>list;
public TextView textView;
public String finished="finished";
private MyViewHolder.OnNoteClickListener mOnNoteClickListener;

public MyListAdapter(Context context, List<String>list, MyViewHolder.OnNoteClickListener onNoteClickListener) {
    this.list=list;
    this.context=context;
    this.mOnNoteClickListener=onNoteClickListener;
}

public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    Button textView;


    OnNoteClickListener onNoteClickListener;

    public MyViewHolder(View itemView,OnNoteClickListener onNoteClickListener) {
        super(itemView);
        textView=(Button) itemView.findViewById(R.id.textView);
        itemView.setOnClickListener(this);
        textView.setOnClickListener(this);
        this.onNoteClickListener=onNoteClickListener;


        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        onNoteClickListener.onNoteClick(getAdapterPosition());





    }



    public interface OnNoteClickListener{
        void onNoteClick(int position);

    }
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) {
    View view= LayoutInflater.from(context).inflate(R.layout.layout_list_item,parent,false);
    final MyViewHolder vHolder=new MyViewHolder(view,mOnNoteClickListener);

    return vHolder;

}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.textView.setText(list.get(position));




}

@Override
public int getItemCount() {
    return list.size();
}

}

Ответы [ 3 ]

0 голосов
/ 09 мая 2019

вы можете установить выбранный вами элемент в arrayList и сохранить этот список массивов в sharedPreference, а когда вы приедете снова, затем извлечь arrayList из sharedPrefrence и проверить идентификаторы проверенных элементов из arrayList, а когда вы установите адаптер, вы можете установить проверку вваш адаптер onBindViewHolder, идентификатор которого содержит arrayList, затем измените текст в «готово», в противном случае установите свой текст «день».

вы можете создать класс AppPreference: -

public class AppPreference {
    private static SharedPreferences mPreferences;
    private static SharedPreferences.Editor mPreferencesEditor;

    public static Set<String> getCamEval(Context ctx) {
            mPreferences = PreferenceManager.getDefaultSharedPreferences(ctx);
            return mPreferences.getStringSet("sdk_camEval", null);
        }

        public static void setCamEval(Context ctx, ArrayList<String> value) {
            mPreferences = PreferenceManager.getDefaultSharedPreferences(ctx);
            mPreferencesEditor = mPreferences.edit();
            Set<String> set = new HashSet<>();
            set.addAll(value);
            mPreferencesEditor.putStringSet("sdk_camEval", set);
            mPreferencesEditor.commit();
        }
}

или выВы можете вызвать эти методы из любого места в вашем проекте: -

, чтобы сохранить свой список: -

SdkPreferences.setCamEval(activity, yourList);

или получить этот список: -

iconNameList.addAll(getCamEval(this));
0 голосов
/ 06 июня 2019

Я нашел проблему и решил ее, используя gSon, и создав новый класс Java для моего listview.bcs, в этом случае он создавался снова и снова, и это была проблема

0 голосов
/ 09 мая 2019

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

@Override
public void onNoteClick(int position) {
    if (position == 0) {
        Log.d(TAG, "onNoteClick: ");
        list.set(0, "Finished");
        adapter.getItemId(0);
        // Here make the change in the source of data
        adapter.notifyDataSetChanged();
}
...