如何使用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 的正确布局选项