我有一个listview,它有一个自定义适配器,其中每行左侧有一个textview,右边有一个edittext,用户可以用它来修改条目值。
默认情况下,每个视图中的EditText视图中放置的值是从传递给适配器的String数组中获取的。
我想知道如何允许用户编辑这些值并将结果保存回同一个String数组中。
我尝试添加文本更改侦听器,因此当用户编辑该值时,新字符串将放置在原始字符串数组中的适当位置。这个问题是,当用户滚动文本时,更改侦听器被激活,并且数组中的值被空字符串覆盖。
以下是一些代码:
public EditTagsListViewAdapter(Context context, String[] objectKeys, String[] objectValues) {
super();
this.context = context;
this.objectKeys = objectKeys;
this.objectValues = objectValues;
}
@Override
public int getCount() {
return objectKeys.length;
}
@Override
public String[] getItem(int position) {
String[] item = new String[2];
item[0] = objectKeys[position];
item[1] = objectValues[position];
return item;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.edit_osm_tag_row, null);
holder = new ViewHolder();
holder.key = (TextView) convertView.findViewById(R.id.tagKey);
holder.value = (EditText) convertView.findViewById(R.id.tagValue);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
String[] rowItem = (String[]) getItem(position);
holder.key.setText(rowItem[0]);
if(rowItem[1].equals("null")) {
holder.value.setText("");
} else {
holder.value.setText(rowItem[1]);
}
holder.value.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
objectValues[position] = s.toString();
Log.i(TAG, "Added changes to adapter");
}
});
return convertView;
}
static class ViewHolder {
protected TextView key;
protected EditText value;
}
我在if(rowItem[1].equals("null")) {
之后将一些edittext值设置为空白,因为变量objectValues中的某些值将设置为字符串“null”,但我希望它们显示为空白。
希望这是有道理的。有谁知道我怎么能做到这一点?
由于
答案 0 :(得分:2)
通常,您的数据源不应与您的视图/适配器紧密耦合。这意味着您可以更改该数据源中的数据,无论您的视图是否正在使用它。当用户想要更改数据时,只需更新源(您的阵列),然后指示适配器/视图重绘。
某些适配器可能会对您改变其内容产生问题,但如果您从头开始实现自己的适配器,或者使用松散耦合的适配器类,则不应遇到任何问题。
如果您使用的是扩展BaseAdapter的适配器,您只需调用notifyDataSetChanged(),然后适配器就可以找出其余部分。
答案 1 :(得分:0)
当用户在键盘上按“Enter”时,您可以使用OnEditorActionListener来保存更改,而不是TextWatcher。
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) {
objectValues[position] = v.getText().toString();
return true;
}
return false;
}
});