如何使用edittexts在自定义ListView中实现监听器文本更改?

Posted

技术标签:

【中文标题】如何使用edittexts在自定义ListView中实现监听器文本更改?【英文标题】:How to implement listener text changes in custom ListView with edittexts? 【发布时间】:2013-03-02 18:06:14 【问题描述】:

我试图将 Edittext 的值保存在 ListView 中并且它可以工作,但是当 ListView 太大时,当我编辑 1 个 edittext 时,如果我滚动 listview,另一个 EditText 正在同时编辑...我不知道该怎么办,我浪费了 6 个小时,一无所获。如果有人可以帮助我,请。

这是自定义Listview的getView的代码

@Override
    public View getView(int position, View convertView, ViewGroup parent) 
        final int position2 = position;
        View v = convertView;
        final ViewHolder holder;

        if(v == null) 
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.lista_item_prepedido, null);

            holder = new ViewHolder();

            holder.codi = (TextView) v.findViewById(R.id.NomProducte);
            holder.nom = (EditText) v.findViewById(R.id.Preu);
            holder.eliminar = (ImageButton) v.findViewById(R.id.delete);
            View eliminarPrepedido = (ImageButton) v.findViewById(R.id.delete);

            if(blocClients.equals("0"))
            
                eliminarPrepedido.setVisibility(View.GONE);
                holder.nom.setFocusable(false);
            


            v.setTag(holder);

            holder.nom.setText(items.get(position).getNom());
            holder.nom.addTextChangedListener(new TextWatcher()

                @Override
                public void afterTextChanged(Editable s) 


                

                @Override
                public void beforeTextChanged(CharSequence s, int start,
                        int count, int after) 
                    // TODO Auto-generated method stub

                

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



                    items.get(position2).Nom = s.toString();



                    String preu = items.get(position2).Nom;
                    String nomproducte = items.get(position2).Codic;
                    int position = position2;

                    //mostrarMensaje("Valor: "+preu+"  Nom Producte: "+nomproducte+"  CodiClient: " +CodicClient+ " posicio: "+position);
                    baseDatos = openOrCreateDatabase(nombreBD, MODE_WORLD_WRITEABLE, null);

                    String sqlStr = "UPDATE estadistiques SET ultimpreu = '" +preu+"' WHERE codic_client='"+CodicClient+"' AND desc_article = '"+nomproducte+"' ";
                    baseDatos.execSQL(sqlStr);

                    try 
                        fnGlobal.CreaSincroFitxer(sqlStr);
                     catch (FileNotFoundException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                     catch (IOException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    

                    baseDatos.close();
                


            );


         else 
            holder = (ViewHolder) v.getTag();

        


        holder.codi.setText(items.get(position).getCodic());


        holder.eliminar.setOnClickListener(new View.OnClickListener() 
            public void onClick(View view) 

                final int position = position2;
                String CodicClient = null;
                Bundle extras = getIntent().getExtras();
                CodicClient = extras.getString("codiClientTab");
                String nomproducte = items.get(position).Codic;
                int Opcio = 1;


                baseDatos = openOrCreateDatabase(nombreBD, MODE_WORLD_WRITEABLE, null);
                String sqlStr = "DELETE FROM estadistiques WHERE codic_client ='"+CodicClient+"' AND desc_article ='"+nomproducte+"'" ;
                baseDatos.execSQL(sqlStr);

                try 
                    fnGlobal.CreaSincroFitxer(sqlStr);
                 catch (FileNotFoundException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                 catch (IOException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                

                baseDatos.close();

                notifyDataSetChanged();

                onResume();

            

        );





        return v;
    

列表视图的自定义 XML 项

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item"
    android:layout_
    android:layout_
    android:background="@drawable/rounded_rectangle"
    android:orientation="horizontal"
    android:padding="6dip" >

    <ImageButton
        android:id="@+id/delete"
        android:layout_
        android:layout_
        android:layout_marginRight="6dp"
        android:layout_marginTop="15dp"
        android:background="@drawable/delete" />

    <RelativeLayout
        android:layout_
        android:layout_ >

        <EditText
            android:id="@+id/Preu"
            android:layout_
            android:layout_
            android:layout_alignLeft="@+id/NomProducte"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:background="@color/white"
            android:ellipsize="end"
            android:gravity="right"
            android:inputType="numberDecimal"
            android:singleLine="true"
            android:text="nom"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/NomProducte"
            android:layout_
            android:layout_
            android:layout_alignBottom="@+id/Preu"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="5dp"
            android:layout_weight="0.16"
            android:clickable="false"
            android:ellipsize="end"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:singleLine="true"
            android:text="codi"
            android:textColor="#000000"
            android:textSize="18sp" />

    </RelativeLayout>

</LinearLayout>

非常感谢! :)

【问题讨论】:

您能否添加来自 R.layout.lista_item_prepedido 的代码,以便清楚自定义 ListView 中的内容 - 它可能有助于人们回答。 更新了 R.layout.item_item_prepedido 【参考方案1】:

如果我理解了您的问题,那么很难让它始终以易于理解的方式运行。我建议您更改实现方式,以便在 ListView 中有两个 TextView,显示这两条信息。当可编辑的被点击时,弹出一个对话框来编辑信息,然后用户必须在移动列表视图之前接受或取消该信息,以明确发生了什么。总之,我建议:

NomProducte 变成现在设置的 TextView。 捕捉 NomProducte 的 onTouch 以打开一个对话框,显示图像、Preu 文本作为 TextView 和 NomProducte 文本作为 EditText。 用户将数据输入其中。 OK -> 接受新的文本操作 取消 -> 忽略新的文本操作。

【讨论】:

谢谢,感谢您的反馈。

以上是关于如何使用edittexts在自定义ListView中实现监听器文本更改?的主要内容,如果未能解决你的问题,请参考以下文章

EditText.SetText() 在自定义适配器中更改我的软键盘输入类型

如何在自定义适配器中搜索?

如何在自定义 ListView 中设置按钮的可见性?

找不到有关如何在自定义小部件中使用 ListView 的正确布局选项

无法在自定义适配器中将 EditText 转换为 TextView

在自定义适配器类中发送服务器请求后,如何更改 Listview 按钮名称?