假设我们有一个包含多个项目的列表。每个项目都有几个片段和一个标签。当用户点击每个标签时,我需要更改列表视图之外的button1的文本。如何从列表项内部接收标签点击事件,并更改列表视图和列表适配器之外的视图。
我知道如何处理适配器内列表视图适配器的内部事件。它就像在GetView()方法中分配事件处理程序一样简单,但它们不在列表中。
感谢您的帮助
答案 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);
...
}