【问题标题】:EditText value inside GridView Changing When Scrolling up/down FastGridView 中的 EditText 值在快速向上/向下滚动时发生变化
【发布时间】:2016-05-11 02:32:22
【问题描述】:

我有一个自定义的 GridView。这是我的应用程序的屏幕截图:

现在当我快速向下滚动时,AYAMBROIR UTUH 中的 editText (2) 内的值会变为另一个单元格。这是截图:

为什么会发生这种情况,我该如何解决?

这是我的适配器代码:

public class CustomGridView2 extends BaseAdapter {
    private ArrayList<ListItem> listData;
    private LayoutInflater layoutInflater;
    private Context context;
    private String[] imageUrls;
    private int count = 0;
    int arrayCount[];
    SharedPreferences prefs ;
    SharedPreference sharedPreference;
    public CustomGridView2(Context context, ArrayList<ListItem> listData) {
        this.listData = listData;
        layoutInflater = LayoutInflater.from(context);
        this.context = context;
        sharedPreference = new SharedPreference();
    }

    @Override
    public int getCount() {
        return listData.size();
    }

    @Override
    public Object getItem(int position) {
        return listData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.afterlogin_product_gridview, null);
            holder = new ViewHolder();
            holder.headlineView = (TextView) convertView.findViewById(R.id.nama_produk);
            holder.teaserView = (TextView) convertView.findViewById(R.id.harga);
            holder.imageView = (ImageView) convertView.findViewById(R.id.img_produk);
            holder.cmdMinus = (Button) convertView.findViewById(R.id.btn_min);
            holder.cmdPlus = (Button) convertView.findViewById(R.id.btn_plus);
            holder.qty = (TextView) convertView.findViewById(R.id.lbl_qty);
            holder.layout1 = (LinearLayout) convertView.findViewById(R.id.layout1);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        ListItem newsItem = listData.get(position);
        String satuan = newsItem.getSatuan().toString();
        String harga = newsItem.getReporterName().toString();
        harga = "Rp. " + harga + " / " + satuan;
        holder.headlineView.setText(newsItem.getHeadline().toUpperCase());
        holder.teaserView.setText(harga);

        String a = newsItem.getUrl();
        holder.cmdPlus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                count = Integer.parseInt( holder.qty.getText().toString());
                count++;
                holder.qty.setText(""+count);
            }
        });

        holder.cmdMinus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                count = Integer.parseInt( holder.qty.getText().toString());

                if(count == 0) {
                    holder.qty.setText("0");
                }
                else {
                    count--;
                    holder.qty.setText("" + count);
                }
            }
        });

        if (holder.imageView != null) {
            //new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl());
            Picasso
                    .with(context)
                    .load(a)
                    .fit()
                    .into(holder.imageView);
        }



        holder.qty.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                if (!holder.qty.getText().toString().matches("0"))
                {
                    holder.layout1.setBackgroundResource(R.drawable.border_radius_gridview);
                }
                else
                {
                    holder.layout1.setBackgroundResource(R.drawable.border_radius);
                }
            }
        });

        return convertView;
    }

    static class ViewHolder {
        TextView headlineView;
        TextView teaserView;
        ImageView imageView;
        TextView satuan,qty;
        Button cmdPlus,cmdMinus;
        LinearLayout layout1;
    }

【问题讨论】:

    标签: android gridview


    【解决方案1】:

    在 ViewHolder 模式中,视图按原样重复使用......所以,在单击加号或减号时,将数量添加到 ListItem 对象并从对象中显示出来......

    holder.teaserView.setText(harga);
    holder.qty.setText(String.valueOf(newsItem.getQuantity()));
    
    String a = newsItem.getUrl();
    holder.cmdPlus.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        count = newsItem.getQuantity();
        count++;
        newsItem.setQuantity(count);
        holder.qty.setText(""+count);
    }
    });
    
    holder.cmdMinus.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    count = newsItem.getQuantity();
    if(count == 0) {
      holder.qty.setText("0");
    }
    else {
    count--;
    newsItem.setQuantity(count);
    holder.qty.setText("" + count);
    }
    }
    });
    

    【讨论】:

    【解决方案2】:

    这是因为视图在所有可滚动视图中重用 - recylcerview listview 和 gridview。因此,当视图被重用时,它们的价值会出现在不应该出现的地方。请查看以下链接以解决您的问题。

    EditText loses content on scroll in ListView

    如果您有任何疑问,请告诉我。

    【讨论】:

    • 我还是不明白。 'scoresToUpdate' 来自哪里?它与我的代码中的“newsItem”相同吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多