如何处理listadapter项内部按钮触发的事件?

时间:2015-02-09 07:08:14

标签: android xamarin xamarin.android

假设我们有一个包含多个项目的列表。每个项目都有几个片段和一个标签。当用户点击每个标签时,我需要更改列表视图之外的button1的文本。如何从列表项内部接收标签点击事件,并更改列表视图和列表适配器之外的视图。

enter image description here

我知道如何处理适配器内列表视图适配器的内部事件。它就像在GetView()方法中分配事件处理程序一样简单,但它们不在列表中。
感谢您的帮助

2 个答案:

答案 0 :(得分:3)

解决

我创建了自定义事件和EventAgrs。当用户单击标签时,我调用此事件,在主活动中,我处理事件并更改buton1的文本。这比我想象的容易。在GetView()中,我将click事件分配给label_Click()事件处理程序。

GetView(){
.
.
    label.Click += label_Click();
.
.
}

在label_Click()中,我调用之前实现的自定义事件:

private void label_Click()(object sender, EventArgs e)
{
    LabelClickedEvent.Invoke(sender, new LabelClickEventArgs("aaa", "bbb"));
}

在列表适配器中我声明了这个自定义事件:(有关详细信息,请查看this guide

public event LabelClickedEventHandler LabelClickedEvent;
public delegate void LabelClickedEventHandler(object, sender,LabelClickEventArgs args);
public class LabelClickEventArgs : EventArgs
{
   public string param1 { get; set; }
   public string param2 { get; set; }
   public LabelClickEventArgs(string param1 , string param2 )
   {
       this.param1 = param1 ;
       this.param2 = param2 ;
   }
}

在主要活动中,我只是将事件分配给我的事件处理程序,并做了所需的事情。

listAdapter.LabelClickedEvent += listAdapter_LabelClickedEvent;
.
.


void listAdapter_LabelClickedEvent(object sender, TheListAdapter.LabelClickEventArgs args)
{
sendButton.Text = args.param1;
}

希望它有所帮助。

答案 1 :(得分:2)

我不知道正确的方法,但一种方法是在适配器中实现标签项OnClickListener(),在创建适配器时将Button 1的引用传递给适配器,然后操作按钮1来自OnClickListener()

public class MyAdapter extends BaseAdapter {
    private Activity activity;
    private ArrayList data;
    private Button button1;

    /*************  CustomAdapter Constructor *****************/
    public MyAdapter(Activity activity, ArrayList data, Button button1) {
        this.data = data;
        this.button1 = button1;
        this.activity = activity;
        inflater = (LayoutInflater) this.activity.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        if (data.size()<=0)
            return 1;
        return data.size();
    }
    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public static class ViewHolder{
        public TextView label1;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        ViewHolder holder;
        if (convertView==null) {
            vi = inflater.inflate(R.layout.list_item, null);
            holder = new ViewHolder();
            holder.label1 = (TextView)vi.findViewById(R.id.tvLabel1);
            holder.label1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    this.button1.setText("Label 1 clicked");
                }
            });
            vi.setTag(holder);
        } else {
            holder = (ViewHolder)vi.getTag();
        }

        // show  the data in the list view
        return vi;
    }
}

假设您在MainActivity外部列表视图中有一个按钮1,因此在MainActivity中创建适配器时 在MainActivity的onCreate方法上执行以下操作:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // define and initialize your data
    Button button1 = (Button)findViewById(R.id.button1);
    MyAdapter adapter  = new MyAdapter(this, data, button1);
    ...
}