是的,总有更好的方法。但有更好的方法吗?:)
所以这个代码是有效的。它是ListActivty的自定义适配器,其思想是每行都有一个按钮,当点击按钮时,该行的项目将被删除,列表将刷新。
private class ThirdActivityAdapter extends ArrayAdapter<String> {
private Context ctx;
private List<String> items;
public ThirdActivityAdapter(Context ctx, List<String> items) {
super(ctx, R.layout.third_activity_list_row, items);
this.ctx = ctx;
this.items = items;
}
public List<String> getItems() {
return items;
}
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.third_activity_list_row, parent, false);
TextView txt = (TextView)row.findViewById(R.id.third_activity_list_row_text);
Button btn = (Button)row.findViewById(R.id.third_activity_list_row_btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = (View)v.getParent();
ListView listView = (ListView)view.getParent();
ThirdActivityAdapter.this.items.remove(listView.getPositionForView(view));
ThirdActivityAdapter.this.notifyDataSetChanged();
}
});
txt.setText(items.get(position));
return row;
}
在click监听器中,我使用ThirdActivityAdapter.this
来获取适配器中的项。有更好的方法吗?我可以看到外部资源是如何工作的,但在继续之前,我想看看是否有更好的设计。
谢谢!
如果我正确理解你的问题,有更好的方法。它涉及到使用View.setTag(键,值)。它允许您为特定视图分配一个键值对,然后使用view.getTag(key).访问它
我会这么做:
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.third_activity_list_row, parent, false);
TextView txt = (TextView)row.findViewById(R.id.third_activity_list_row_text);
Button btn = (Button)row.findViewById(R.id.third_activity_list_row_btn);
btn.setTag(R.id.button_position, position); // Save position to View
btn.setOnClickListener(mYourClickListener);
txt.setText(items.get(position));
return row;
}
View.OnClickListener mYourClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = v.getTag(R.id.view_position); // Obtain position
removeItem(position);
}
}
// Avoids this syntax because its clear to whom this method belongs.
private void remoteItem(int position) {
items.remove(position);
notifyDataSetChanged();
}
此外,请考虑使用ViewHolder模式,以避免重复引用findViewById()
。