2015-03-02 68 views
0

是的,总会有更好的方法。但是有没有更好的方法可行? :)在Android事件处理程序中使用'this'。有没有更好的办法?

所以这段代码的作品。它是一个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.this获得在适配器的项目。有一个更好的方法吗?我可以看到外部源如何工作,但我想在继续之前看看是否有更好的设计。

谢谢!

+0

*“是的,总有一种更好的方法,但有没有更好的方法可行?”*。如果有更好的办法,但这是不可能的,那么它不会是一个更好的方法。这将是...不是一种方式 – codeMagic 2015-03-02 16:37:44

+0

您不需要在items.remove或notifyDataSetChanged中使用'ThirdActivityAdapter.this'。你也可以直接做。 – Apurva 2015-03-02 16:37:55

+0

这是更好的方法。出于某种原因,我认为“物品”不可访问,因为它不是最终的。 – 2015-03-02 16:55:50

回答

0

还有更好的方法,如果我正确理解你的问题。它涉及使用View.setTag(键,值)。它允许您将键值对分配给特定视图,并稍后使用View.getTag(键)访问它。

这里是我会做:

@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()引用。

+0

这很接近。我现在无法尝试。我认为这将起作用。但是在click监听器中需要获取按钮的父代,然后标记,因为发送给onClick的视图是按钮,我需要该行,因为这是标签所在的位置。我想也可以在按钮本身上设置标签。 – 2015-03-02 16:59:11

+0

啊,我的错,我会编辑代码。 – 2015-03-02 17:00:46

相关问题