0

Имею RecyclerView, в каждой строчке которого есть EditText. Как сохранять все значения, введенные в эти EditText`s, при переходе в другую активность, сворачивании и закрытии приложения? Спасибо!

MainActivity


    RecyclerView recyclerView;
    RecyclerView.Adapter gAdapter;
    RecyclerView.LayoutManager layoutManager;
public static List<ListCigarets> listUtilsPrint;

RequestQueue rw;

String request_url = "http://www.json-generator.com";


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

    rw = Volley.newRequestQueue(this);

    recyclerView = (RecyclerView) findViewById(R.id.recyclerViewNewspaper);
    recyclerView.setHasFixedSize(true);

    layoutManager = new LinearLayoutManager(this);

    recyclerView.setLayoutManager(layoutManager);

    listUtilsPrint = new ArrayList<>();

    sendRequest();
}

public void sendRequest() {
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, request_url, null, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            for (int i = 0; i < response.length(); i++) {
                ListCigarets listPrint = new ListCigarets();
                try {
                    JSONObject jsonObject = response.getJSONObject(i);

                    listPrint.setName(jsonObject.getString("name"));
                    listPrint.setBarcode(jsonObject.getString("barcode"));
                    listPrint.setPrice(jsonObject.getString("price"));

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                listUtilsPrint.add(listPrint);
            }
            gAdapter = new CustomRecyclerAdapter(NewspaperActivity.this, listUtilsPrint);

            recyclerView.setAdapter(gAdapter);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.i("Volley Error: ", String.valueOf(error));
        }


    });
    rw.add(jsonArrayRequest);``` 



Adapter

private Context context;
public static List<ListCigarets> listCigarets;
public static int count;

public CustomRecyclerAdapter(Context context, List listCigarets) { this.context = context; this.listCigarets = listCigarets; }

@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_activity, parent, false); ViewHolder viewHolder = new ViewHolder(v); return viewHolder; }

@Override public void onBindViewHolder(final ViewHolder holder, int position) {

final ListCigarets product = listCigarets.get(position);

holder.itemView.setTag(listCigarets.get(position));

ListCigarets pu = listCigarets.get(position);

holder.gName.setText(pu.getName());
holder.gBarcode.setText(pu.getBarcode());
holder.gPrice.setText(pu.getPrice());

holder.quantity.setText(formatValue(product.getCount(), product.getUnit()));

holder.plus.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        count = product.getCount() + 1;
        product.setCount(count);
        holder.quantity.setText(formatValue(count, product.getUnit()));
    }
});
holder.minus.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        count = product.getCount() - 1;
        if(count &lt; 0) count = 0;
        product.setCount(count);
        holder.quantity.setText(formatValue(count, product.getUnit()));
    }
});

}

private String formatValue(int count, String unit) { return String.valueOf(count); }

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

public void filterList(ArrayList<ListCigarets> filteredList) { listCigarets = filteredList; notifyDataSetChanged(); }

public class ViewHolder extends RecyclerView.ViewHolder { public TextView gName; public TextView gBarcode; public TextView gPrice; public ImageButton plus; public ImageButton minus; public EditText quantity;

public ViewHolder(View itemView) {
    super(itemView);

    gName = (TextView) itemView.findViewById(R.id.nameCart);
    gBarcode = (TextView) itemView.findViewById(R.id.barcodeCart);
    gPrice = (TextView) itemView.findViewById(R.id.priceCart);
    quantity = (EditText) itemView.findViewById(R.id.quantity);
    plus = (ImageButton) itemView.findViewById(R.id.plus);
    minus = (ImageButton) itemView.findViewById(R.id.minus);

}

}



 [1]: https://i.stack.imgur.com/wZwd7.png
ttifffany8
  • 13
  • 2

1 Answers1

0

Смотрите, когда вы просто листаете список в этот момент ваш ViewHolder уже перезатирает скрытые EditText-ы т.к. RecyclerView переиспользует ViewHolder-ы.

Исходя из этого вам вероятно нужно хранить в вашем RecyclerView эти строки. Я бы создал какую-нибудь Map<Int, String> где key - это позиция, а value - ваша строка. При бинде вашего ViewHolder-а вы будете смотреть на эту мапу, если под ключем равным позиции уже есть какое-то значение - вы заполняете им ваш EditText, иначе - оставляете пустым.

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

Sergei Buvaka
  • 10,378