Как контролировать просмотр списка для перезагрузки.

Я столкнулся с проблемой в виде списка. В моем списке просмотра есть редактировать текст и текстовое представление. Когда я прокручиваю список, мои данные, которые вводятся в текстовом представлении, теряют значение и показывают значение по умолчанию. У меня есть две кнопки в виде списка, я увеличиваю количество и прокручиваю список для следующего продукта, когда я возвращаюсь, текстовый вид потерял значение и показывает значение по умолчанию 1 . И когда я открываю клавиатуру для ввода данных, то же проблема. Помогите мне, пожалуйста. И это мой код

Пользовательский адаптер

 private List<ShowProducts> listShowProducts;
    private Context context;
    private int resource;
    private String condition;
    String uri;
    private static final String TAG = "CustomAdapter";
    int i = 0;
    float total;
    ListView listView;
    TextView tvTotal;
    float sum = 0;

    public CustomAdapter(@NonNull Context context, @LayoutRes int resource,  List<ShowProducts> objects) {
        super(context, resource, objects);
        this.context = context;
        this.resource = resource;
        this.listShowProducts = objects;
    }
    @Override
    public int getCount() {
        return super.getCount();
    }

    @Nullable
    @Override
    public Object getItem(int position) {
        return super.getItem(position);
    }

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

        View view = LayoutInflater.from(context).inflate(resource, parent, false);
  {
            final ShowProducts showProducts = listShowProducts.get(position);

            ImageView imageView = (ImageView) view.findViewById(R.id.imageViewOfSelecteditem);
            ImageView plus = (ImageView) view.findViewById(R.id.imageviewPlus);
            ImageView minus = (ImageView) view.findViewById(R.id.imageviewminus);
            TextView tvSetNameOfSeletedItem = (TextView) view.findViewById(R.id.tvSetNameOfSeletedItem);
            TextView tvSetSizeOfSeletedItem = (TextView) view.findViewById(R.id.tvSetSizeOfSeletedItem);
            TextView tvSetPriceOfSeletedItem = (TextView) view.findViewById(R.id.tvSetPriceOfSeletedItem);
            final TextView tvQunatitySetOfSelectedItem = (TextView) view.findViewById(R.id.tvQunatitySetOfSelectedItem);
            for (int a = 0; a < 10; a++) {
                Log.d(TAG, "onnnnView: ");
            }


            Log.d(TAG, "getView: +++++");
            tvSetNameOfSeletedItem.setText(showProducts.getProduct_name().toString());
            tvSetSizeOfSeletedItem.setText(showProducts.getSize_name());
            tvSetPriceOfSeletedItem.setText(String.valueOf(showProducts.getSize_price()).toString());
            uri = showProducts.getProduct_photo().toString();

            Picasso.with(context).load(uri).into(imageView);

            plus.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int a = Integer.parseInt(tvQunatitySetOfSelectedItem.getText().toString());
                    a++;
                    Log.d(TAG, "getView: ");
                    if (a <= showProducts.getSize_quantity()) {
                        tvQunatitySetOfSelectedItem.setText(String.valueOf(a).toString());
                        tvTotal = (TextView) ((Activity) context).findViewById(R.id.tvTotalShow);
                        float price = Float.parseFloat(tvTotal.getText().toString());
                        sum = price + showProducts.getSize_price();
                        tvTotal.setText(String.valueOf(sum));
                    }

                }
            });

            minus.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int a = Integer.parseInt(tvQunatitySetOfSelectedItem.getText().toString());
                    a--;
                    if (a > 0)
                    {
                        tvQunatitySetOfSelectedItem.setText(String.valueOf(a).toString());
                        tvTotal = (TextView) ((Activity) context).findViewById(R.id.tvTotalShow);
                        float price = Float.parseFloat(tvTotal.getText().toString());
                        sum = price - showProducts.getSize_price();
                        tvTotal.setText(String.valueOf(sum));
                    }
                }
            });
        }

        return view;
}

И код активности

public class SelectedProductFromShopingCartShow extends AppCompatActivity {

    ArrayList<ShowProducts> arrayList = new ArrayList<>();
    String condition = "SelectedItemsFromShoppingCart";
    CustomAdapter customAdapter;
    ListView listView;
    TextView tvTotal;
    EditText etDiscount;
    int total;
    float sum = 0;
    Button discount;
    private static final String TAG = "SelectedProductFromShop";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_selected_product_from_shoping_cart_show);
        listView = (ListView) findViewById(R.id.listViewSelectedItemsOfShopingCart);
        tvTotal = (TextView) findViewById(R.id.tvTotalShow);
        etDiscount = (EditText) findViewById(R.id.etDiscount);


        arrayList = (ArrayList<ShowProducts>) getIntent().getSerializableExtra("selectedList");
        ShowProducts showProducts = arrayList.get(0);
        Log.d(TAG, "onnnnCreate: " + showProducts.getProduct_name());
        customAdapter = new CustomAdapter(SelectedProductFromShopingCartShow.this, R.layout.show_selected_item_of_shopingcart, condition, arrayList);
        listView.setAdapter(customAdapter);
        getTotalListView();
        Log.d(TAG, "onnnnCreate: Before inner class");

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
                AlertDialog.Builder builder = new AlertDialog.Builder(SelectedProductFromShopingCartShow.this);
                builder.setTitle("Delete this product");
                builder.setMessage("Are you sure you want to delete it?");
                builder.setCancelable(true);
                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        arrayList.remove(position);
                        customAdapter.notifyDataSetChanged();
                        Toast.makeText(SelectedProductFromShopingCartShow.this, "item deleted", Toast.LENGTH_SHORT).show();
                    }
                });
                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
                builder.setIcon(android.R.drawable.ic_dialog_alert);
                builder.show();
                return true;
            }
        });

    }

    public void getTotalListView() {
        sum = 0;
        for (int i = 0; i < arrayList.size(); i++) {
            ShowProducts showProducts = arrayList.get(i);
            sum = sum + showProducts.getSize_price();
            tvTotal.setText(String.valueOf(sum));
        }
    }

И посмотрите это видео, чтобы понять проблемы

https://youtu.be/WAjtRkI5dl4

2 ответа

Вы должны следовать шаблону видоискателя. Это решит вашу проблему. Вы можете проверить это здесь https://developer.android.com/training/improving-layouts/smooth-scrolling.html

Единственное место, где вы ведете счет - это вид. Вы должны сделать свой счет поле в элементе списка ShowProducts и создать геттер и сеттер. Например, в plusonClickListener, вместо

    int a = Integer.parseInt(tvQunatitySetOfSelectedItem.getText().toString());
    a++;

Вы будете иметь

    // for example, in the `plus` listener
    int a = showProducts.getCount();
    a++;
    showProducts.setCount(a);

И не забывай

    notifyDataSetChanged();
Другие вопросы по тегам