我有一个使用ArrayAdapter的ListActivity来显示行。 我想要内联编辑行,准确地说,我希望在用户点击视图时切换其中一个视图中的文本。例如。如果TextView Value id为“Complete”,它将变为“Incomplete”,反之亦然。
但问题是,行tvstate值始终是最后一行的值而不是点击的那一行。
我错过了一些基本的东西。请帮忙,因为我对Android开发很陌生。
编辑:即使不是内联编辑,即使是更新适配器中同一行的机制也会有所帮助。
这是我的适配器代码。
public View getView(final int position, View convertView,final ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.rowlayout_cpe, null);
}
CPEDetails dt = items.get(position);
if (dt != null) {
tvSNo = (TextView) v.findViewById(R.id.serialNumber);
tvState = (TextView) v.findViewById(R.id.state);
if (tvSNo != null && tvState != null) {
tvSNo.setText(dt.getVc_serial());
tvState.setText(dt.getState());
}
}
tvState.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
tvState.setText(tvState.getText().toString().equalsIgnoreCase("Completed")?"Incomplete":"Completed");
Utility.i("On Click State ::"+position);
CPEDetails cpe = new CPEDetails();
cpe.setVc_serial(tvSNo.getText().toString());
cpe.setState(tvState.getText().toString());
items.set(position, cpe);
notifyDataSetChanged();
}
});
btnDelete = (ImageButton) v.findViewById(R.id.btnDelete);
btnDelete.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
items.remove(position);
notifyDataSetChanged();
}
});
return v;
}
答案 0 :(得分:0)
这是因为您使用的自定义适配器缺少某些部分。
应该看起来像:
ViewHolder holder;
View v = convertView;
holder = null;
if (v == null) {
holder = new ViewHolder();
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.rowlayout_cpe, null);
holder.tvSNo = (TextView) v.findViewById(R.id.serialNumber);
holder.tvState = (TextView) v.findViewById(R.id.state);
v.setTag(holder);
} else
holder = (ViewHolder) v.getTag();
CPEDetails dt = items.get(position);
if (dt != null) {
if (tvSNo != null && tvState != null) {
holder.tvSNo.setText(dt.getVc_serial());
holder.tvState.setText(dt.getState());
}
}
class ViewHolder {
TextView tvSNo;
TextView tvState;
}
... setonclicklistener代码的其余部分......
答案 1 :(得分:0)
我想你使用tvSNo和tvState作为适配器类的字段。每次调用getView(...)都会重写这些字段,所以在最后调用tvState之后,tbSNo会保存列表的最后一个可见行。 尝试使用ViewHolder模式,这是来自Google IO的Romain Guy演示文稿:http://youtu.be/N6YdwzAvwOA?t=2m。还有很多例子(http://goo.gl/YV6xaA - 这是第一个来自快速谷歌搜索)