首页 > 解决方案 > 滚动时编辑列表重复数据中的文本

问题描述

我遇到了这个问题:虽然列表视图回收了视图,但它复制了插入到编辑文本中的数据,我只需要从编辑文本中不被复制,这样我就能得到正确的数量。我尝试不回收视图,但是当我向下滚动时删除了这些值。

public class ArticleAdapter extends ArrayAdapter<Article>
{


    public  static List<Livraison_detail> MAJdb=new ArrayList<Livraison_detail>();;
    ViewHolder viewHolder;
    List<Article> articles=null;
    String []qtes;

    public ArticleAdapter(Context context, int resource, List<Article> objects)
    {
        super(context, resource, objects);
        articles=new ArrayList<>(objects);
        qtes=new String[articles.size()];
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        viewHolder= new ViewHolder();

        if(convertView==null){
            LayoutInflater infalter=LayoutInflater.from(getContext());
            convertView=infalter.inflate(R.layout.list_view_article,parent,false);


            viewHolder.designation = (TextView) convertView.findViewById(R.id.desi);
            viewHolder.quantité = (TextView) convertView.findViewById(R.id.qte_disp_2);
            viewHolder.prix = (TextView) convertView.findViewById(R.id.prix);
            viewHolder.qte=(EditText) convertView.findViewById(R.id.qte);
            viewHolder.cb=(CheckBox)convertView.findViewById(R.id.cbarticle);



            viewHolder.cb.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    CheckBox check=(CheckBox)view;
                    check.requestFocus();
                    if (check.isChecked())
                    {
                        Article a =articles.get((int)check.getTag());
                        Livraison_detail l=new Livraison_detail();
                        l.CODE_ARTICLE=a.CODE_ARTICLE;
                        l.PRIX_ACHAT=a.PRIX_VENTE;
                        try
                        {
                            if(qtes[(int)check.getTag()].equals(""))
                            {
                                throw new Exception();
                            }else {
                                if (Double.parseDouble(qtes[(int)check.getTag()])>a.QTE_CHARGE) throw  new QuantitéInsuffisanteException();
                                else{
                                    l.QTE_LIVRE=Double.parseDouble(qtes[(int)check.getTag()]);
                                    MAJdb.add(l);
                                }
                            }
                        }
                        catch (QuantitéInsuffisanteException e)
                        {
                            new AlertDialog.Builder(getContext())
                                    .setTitle("Quantité Insuffisante")
                                    .setMessage("la quantité saisie est superieur que celle du Stock il y a "+a.QTE_CHARGE+" artcile Disp")
                                    .setCancelable(true)
                                    .setIcon(R.drawable.alert)
                                    .setNeutralButton("Compris",null )
                                    .show();
                        }
                        catch (Exception e)
                        {
                            Toast.makeText(getContext(), "Il faut toucher le fin bouton du clavier puis re-cochez", Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        Article a2=articles.get((int)check.getTag());

                        for (Livraison_detail l:MAJdb) {
                            if (l.CODE_ARTICLE.equals(a2.CODE_ARTICLE))
                            {
                                MAJdb.remove(l);
                            }
                        }
                    }
                }
            });

            viewHolder.qte.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    final int position = view.getId();
                    final EditText Caption = (EditText) view;
                    qtes[position]=Caption.getText().toString();
                    if(Caption.isFocused()) {Caption.clearFocus();}
                }
            });

            convertView.setTag(viewHolder);
            convertView.setTag(R.id.cbarticle, viewHolder.cb);
            convertView.setTag(R.id.qte, viewHolder.qte);
        }
        else {
            viewHolder =(ViewHolder)convertView.getTag();
        }
        viewHolder.qte.setTag(position);
        viewHolder.cb.setTag(position);
        viewHolder.qte.setId(position);



        Article article=articles.get(position);
        if(article !=null)
        {
            viewHolder.designation.setText(article.DESIGNATION);
            viewHolder.prix.setText(Double.toString(article.PRIX_VENTE));
            viewHolder.quantité.setText(Integer.toString(article.QTE_CHARGE));
        }


        return convertView;
    }



    private class ViewHolder
    {
        TextView designation;
        TextView quantité;
        TextView prix;
        EditText qte;
        CheckBox cb;
    }


}

标签: androidlistviewandroid-edittext

解决方案


很难编译代码来检查错误。但是看着它,我可以提出两个建议:

  1. ViewHolder为每个位置单独存储;
  2. 不要使用View.setTag()方法来存储位置值;

    public static List<Livraison_detail> MAJdb = new ArrayList<Livraison_detail>();
    
    private SparseArray<ViewHolder> map = new SparseArray<>();
    List<Article> articles = null;
    String[] qtes;
    
    public ArticleAdapter(Context context, int resource, List<Article> objects) {
        super(context, resource, objects);
        articles = new ArrayList<>(objects);
        qtes = new String[articles.size()];
    }
    
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
    
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater infalter = LayoutInflater.from(getContext());
            convertView = infalter.inflate(R.layout.list_view_article, parent, false);
    
    
            viewHolder.designation = (TextView) convertView.findViewById(R.id.desi);
            viewHolder.quantité = (TextView) convertView.findViewById(R.id.qte_disp_2);
            viewHolder.prix = (TextView) convertView.findViewById(R.id.prix);
            viewHolder.qte = (EditText) convertView.findViewById(R.id.qte);
            viewHolder.cb = (CheckBox) convertView.findViewById(R.id.cbarticle);
    
    
            viewHolder.cb.setOnClickListener(
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            CheckBox check = (CheckBox) view;
                            check.requestFocus();
                            if (check.isChecked()) {
                                Article a = articles.get(position);
                                Livraison_detail l = new Livraison_detail();
                                l.CODE_ARTICLE = a.CODE_ARTICLE;
                                l.PRIX_ACHAT = a.PRIX_VENTE;
                                try {
                                    if (qtes[position].equals("")) {
                                        throw new Exception();
                                    } else {
                                        if (Double.parseDouble(qtes[position]) > a.QTE_CHARGE) {
                                            throw new QuantitéInsuffisanteException();
                                        } else {
                                            l.QTE_LIVRE = Double.parseDouble(qtes[position]);
                                            MAJdb.add(l);
                                        }
                                    }
                                } catch (QuantitéInsuffisanteException e) {
                                    new AlertDialog.Builder(getContext())
                                            .setTitle("Quantité Insuffisante")
                                            .setMessage("la quantité saisie est superieur que celle du Stock il y a " + a.QTE_CHARGE + " artcile Disp")
                                            .setCancelable(true)
                                            .setIcon(R.drawable.alert)
                                            .setNeutralButton("Compris", null)
                                            .show();
                                } catch (Exception e) {
                                    Toast.makeText(getContext(), "Il faut toucher le fin bouton du clavier puis re-cochez", Toast.LENGTH_SHORT).show();
                                }
                            } else {
                                Article a2 = articles.get(position);
    
                                for (Livraison_detail l : MAJdb) {
                                    if (l.CODE_ARTICLE.equals(a2.CODE_ARTICLE)) {
                                        MAJdb.remove(l);
                                    }
                                }
                            }
                        }
                    });
    
            viewHolder.qte.setOnClickListener(
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            final int position = view.getId();
                            final EditText Caption = (EditText) view;
                            qtes[position] = Caption.getText().toString();
                            if (Caption.isFocused()) {
                                Caption.clearFocus();
                            }
                        }
                    });
    
            map.put(position, viewHolder);
            convertView.setTag(R.id.cbarticle, viewHolder.cb);
            convertView.setTag(R.id.qte, viewHolder.qte);
        } else {
            viewHolder = map.get(position);
        }
    
        viewHolder.qte.setTag(position);
        viewHolder.cb.setTag(position);
        viewHolder.qte.setId(position);
    
    
        Article article = articles.get(position);
        if (article != null) {
            viewHolder.designation.setText(article.DESIGNATION);
            viewHolder.prix.setText(Double.toString(article.PRIX_VENTE));
            viewHolder.quantité.setText(Integer.toString(article.QTE_CHARGE));
        }
    
    
        return convertView;
    }
    
    
    private class ViewHolder {
        TextView designation;
        TextView quantité;
        TextView prix;
        EditText qte;
        CheckBox cb;
    }
    

推荐阅读