Mic*_*ael 8 android listview android-edittext
我有一个Android活动,其中我有一个ListView绑定到自定义ArrayAdapter.ListView的每一行都有两个EditText(数字)字段.
ArrayAdapter最初是从SQLite DB填充的.但是,用户可以在ListView的末尾添加一行,或者(通过长按一行)删除ListView中的任何行.当他们点击"保存"按钮时,他们的更改会保持不变.
我通过将AfterTextChanged()事件的CustomTextWatcher附加到ArrayAdapter的getView()方法中的每个EditText(传递EditText和ArrayAdapter项目列表中的相应对象)然后设置匹配来跟踪更改.该对象的属性为EditText的内容.这样,在保存时我可以简单地遍历底层对象列表并进行适当的DB更改,因为知道对象列表是最新的.
适配器类和CustomTextWatcher的代码:
private class CustomAdapter extends ArrayAdapter<DataItem> {
private ArrayList<DataItem> items;
public CustomAdapter(Context context, int textViewResourceId, ArrayList<DataItem> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
DataItem wed = items.get(position);
if (v == null) {
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.log_exercise_row, null);
}
if(wed != null)
{
EditText text1 = (EditText) v.findViewById(R.id.text1);
EditText text2 = (EditText) v.findViewById(R.id.text2);
text1.addTextChangedListener(new CustomTextWatcher(text1,wed));
text2.addTextChangedListener(new CustomTextWatcher(text2,wed));
int weight = wed.getWeight();
if(weight != -1)
{
text1.setText(weight+"");
}
int reps = wed.getReps();
if(reps != -1)
{
text2.setText(reps+"");
}
}
return v;
}
private class CustomTextWatcher implements TextWatcher {
private EditText EditText;
private DataItem item;
public CustomTextWatcher(EditText e, DataItem item)
{
this.EditText = e;
this.item = item;
}
@Override
public void afterTextChanged(Editable arg0) {
String text = arg0.toString();
if(text != null && text.length() > 0)
{
int val;
try
{
val =Integer.parseInt(text);
}
catch(NumberFormatException e)
{
val=-1;
}
if(EditText.getId()==R.id.weightEditText)
{
item.setWeight(val);
}
else if(EditText.getId()==R.id.repsEditText)
{
item.setRepetitions(val);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这一切都正常,除非在不希望的EditText内容重复发生时添加或删除项目.
举例说明:
从3行开始,EditText全部为空
在第2行,输入'5','6'
单击'更多' - >在末尾添加(空)行.现在4行.
删除最后一行 - >显示3行,但第2行和第3行现在显示'5','6' - > ???????
看起来像重新绑定后ListView中的EditText对象的相对位置不稳定,这导致了问题.例如EditText对象'X'从位置3开始,然后在重新绑定后它位于位置1 - 但它仍然附加一个CustomTextWatcher引用位置3中的数据对象.另一个问题是addTextChangedListener()没有影响已附加到EditText的TextWatchers.
我对Android很新,所以我不确定是否有更好的方法来解决我的问题.任何帮助表示赞赏.
Mic*_*ael 10
它看起来像我需要的自定义('ViewHolder')类,以保持EditText及其相关数据对象之间的引用在数据的每个'绑定'上正确同步.此外,当getView()方法中的convertView对象为null时放置事件侦听器调用意味着每个EditText对象只添加一个侦听器.
感谢http://www.vogella.de/articles/AndroidListView/article.html#listsactivity让我指向正确的方向.
public class CustomAdapter extends ArrayAdapter<DataItem> {
private ArrayList<DataItem> items;
private Activity Context;
public CustomAdapter(Activity context, int textViewResourceId, ArrayList<DataItem> items) {
super(context, textViewResourceId, items);
this.items = items;
this.Context = context;
}
static class ViewHolder {
protected EditText weight;
protected EditText reps;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
DataItem wed = items.get(position);
if (v == null) {
LayoutInflater inflator = Context.getLayoutInflater();
v = inflator.inflate(R.layout.log_exercise_row, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text1 = (EditText) v.findViewById(R.id.text1);
viewHolder.text2 = (EditText) v.findViewById(R.id.text2);
viewHolder.text1.addTextChangedListener(new CustomTextWatcher(viewHolder, viewHolder.text1));
viewHolder.text2.addTextChangedListener(new CustomTextWatcher(viewHolder, viewHolder.text2));
v.setTag(viewHolder);
viewHolder.text1.setTag(wed);
viewHolder.text2.setTag(wed);
}
else
{
ViewHolder holder = (ViewHolder) v.getTag();
holder.text1.setTag(wed);
holder.text2.setTag(wed);
}
ViewHolder holder = (ViewHolder) v.getTag();
// set values
if(wed.getWeight() != -1)
{
holder.text1.setText(wed.getWeight()+"");
}
else
{
holder.weight.setText("");
}
if(wed.getRepetitions() != -1)
{
holder.text2.setText(wed.getRepetitions()+"");
}
else
{
holder.reps.setText("");
}
return v;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11223 次 |
| 最近记录: |