如何处理由列表适配器项目内部的按钮触发的事件?
How to handle an event that is trigged by a button from inside of a listadapter item?
假设我们有一个包含多个项目的列表。每个项目都有几个片段和一个标签。当用户单击每个标签时,我需要更改列表视图之外的 button1 的文本。我如何从列表项内部接收该标签单击事件并更改列表视图和列表适配器之外的视图。
我知道如何在适配器内部处理列表视图适配器的内部事件。它就像在 GetView() 方法中分配事件处理程序一样简单,但它们在列表之外不可用。
感谢您的帮助
我不知道正确的方法,但一种方法是在适配器中实现标签项的 OnClickListener()
,在创建适配器时将 Button 1 的引用传递给您的适配器,然后从 OnClickListener()
.
操作按钮 1
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);
...
}
已解决
我创建了一个 自定义事件 和 EventAgrs。当用户单击我调用此事件的标签时,在主要 activity 中我处理该事件并更改 buton1 的文本。这比我想象的要容易。在 GetView() 中,我将点击事件分配给 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 ;
}
}
在主体 activity 中,我只是将事件分配给我的事件处理程序并执行所需的任何操作。
listAdapter.LabelClickedEvent += listAdapter_LabelClickedEvent;
.
.
void listAdapter_LabelClickedEvent(object sender, TheListAdapter.LabelClickEventArgs args)
{
sendButton.Text = args.param1;
}
希望对大家有所帮助。
假设我们有一个包含多个项目的列表。每个项目都有几个片段和一个标签。当用户单击每个标签时,我需要更改列表视图之外的 button1 的文本。我如何从列表项内部接收该标签单击事件并更改列表视图和列表适配器之外的视图。
我知道如何在适配器内部处理列表视图适配器的内部事件。它就像在 GetView() 方法中分配事件处理程序一样简单,但它们在列表之外不可用。
感谢您的帮助
我不知道正确的方法,但一种方法是在适配器中实现标签项的 OnClickListener()
,在创建适配器时将 Button 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);
...
}
已解决
我创建了一个 自定义事件 和 EventAgrs。当用户单击我调用此事件的标签时,在主要 activity 中我处理该事件并更改 buton1 的文本。这比我想象的要容易。在 GetView() 中,我将点击事件分配给 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 ;
}
}
在主体 activity 中,我只是将事件分配给我的事件处理程序并执行所需的任何操作。
listAdapter.LabelClickedEvent += listAdapter_LabelClickedEvent;
.
.
void listAdapter_LabelClickedEvent(object sender, TheListAdapter.LabelClickEventArgs args)
{
sendButton.Text = args.param1;
}
希望对大家有所帮助。