使用';这';在Android事件处理程序中。有更好的办法吗?

使用';这';在Android事件处理程序中。有更好的办法吗?,android,listview,Android,Listview,是的,总有更好的办法。但是有没有更好的办法呢?:) 所以这个代码是有效的。它是ListActivty的自定义适配器,其思想是每行都有一个按钮,当点击按钮时,该行的项目将被删除,列表将刷新 private class ThirdActivityAdapter extends ArrayAdapter<String> { private Context ctx; private List<String> items; public ThirdActiv

是的,总有更好的办法。但是有没有更好的办法呢?:)

所以这个代码是有效的。它是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;
    }
私有类ThirdActivityAdapter扩展了ArrayAdapter{
私有上下文ctx;
私人清单项目;
公共ThirdActivityAdapter(上下文ctx,列表项){
超级(ctx,右布局,第三行活动列表,项目);
this.ctx=ctx;
这个项目=项目;
}
公共列表getItems(){
退货项目;
}
@凌驾
公共视图getView(int位置、视图转换视图、最终视图组父视图){
LayoutFlater充气机=(LayoutFlater)getSystemService(布局充气机服务);
视图行=充气机。充气(R.layout.third\u activity\u list\u row,parent,false);
TextView txt=(TextView)row.findViewById(R.id.third\u activity\u list\u row\u text);
按钮btn=(按钮)行.findViewById(R.id.third\u activity\u list\u row\u btn);
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
视图=(视图)v.getParent();
ListView ListView=(ListView)view.getParent();
ThirdActivityAdapter.this.items.remove(listView.getPositionForView(view));
this.notifyDataSetChanged();
}
});
txt.setText(items.get(position));
返回行;
}
在click listener中,我正在使用
ThirdaTivityAdapter。这
来获取适配器中的项。是否有更好的方法来实现这一点?我可以看到外部源代码如何工作,但我想在继续之前看看是否有更好的设计

谢谢!

如果我正确理解您的问题,有一个更好的方法。它涉及使用View.setTag(key,value)。它允许您为特定视图分配一个键值对,然后使用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();
}

此外,请注意使用该模式以避免重复引用
findviewbyd()

“是的,总有更好的方法。但是有更好的方法吗?”。如果有更好的方法,但这是不可能的,那么它就不是一个更好的方法。它将是…不是一种你不需要使用
ThirdActivityAdapter的方法。这
与items.remove或notifyDataSetChanged一起使用。你也可以直接这样做。这是更好的方法。出于某种原因,我认为
items
将无法访问因为它不是最终的。不要每次getView()都创建一个新的侦听器对象调用时,只需让您的ThirdActivityAdapter实现onClick listener,这样您将只有一个listener接近。我现在无法尝试。我认为这会起作用。但在单击中,listener需要获取按钮的父级,然后标记,因为发送到onClick的视图是按钮,我需要行,因为这是我想你也可以在按钮上设置标签。