【问题标题】:Android How to Identify Listview Button clicked event from outside adapter?Android 如何识别来自外部适配器的 Listview 按钮单击事件?
【发布时间】:2014-10-23 09:15:16
【问题描述】:

我有一个自定义列表视图,其中包含按钮作为项目。

我想将 Listener 设置为此按钮。目前我在适配器中使用以下代码来识别它。

  holder.editDetails.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //rowItem.getUserID();
            Toast.makeText(getContext(), "Done", Toast.LENGTH_SHORT).show();

            }
    });

是否有办法在适配器外部识别此按钮 onclick 事件。(在 Main.class 中)如

  listView.setOnItemClickListener(new OnItemClickListener() {
   });

对不起我的英语不好

【问题讨论】:

  • 详细说明您为什么要这样做。你想从你的适配器访问活动吗?
  • 是的..这就是我想要的。

标签: android listview


【解决方案1】:

您可以为此创建一个界面。将您的接口传递给您的适配器,并在您单击按钮时调用它。

public interface onDoneClick{
    void onClick(View v, int position);
}

在这个界面中,我们将传递适配器上的位置以及视图。

接下来将接口添加到您的适配器的构造函数,并将其保存在一个字段中。例如:

public MyAdapter(Context context, int textViewResourceId, List<MyObject> objects,onDoneClick listener ) {
    super(context, textViewResourceId, objects);
    mListener = listener;
}

现在我们有了监听器,只需在您的 holder.editDetails 点击监听器上调用它:

    @Override
    public void onClick(View v) {
         mListener.onClick(v,position);//where position is the position in the adapter
      }

接下来在您的 activity 上创建适配器时,只需将侦听器传递给它:

    new MyAdapter(this, 0, myobjectList, new onDoneClick() {
        @Override
        public void onClick(View v, int position) {
            //whatever you want to do.
        }
    });

【讨论】:

  • 我参加聚会有点晚了,但这太有用了。谢谢!
【解决方案2】:

您可以在 Activity 中创建一个方法,例如:

public void setListenerToButton(Button b){
    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //rowItem.getUserID();
            Toast.makeText(getContext(), "Done", Toast.LENGTH_SHORT).show();
        }
    });
}

在getView内部

((YourActivity)getContext()).setListenerToButton(holder.editDetails);

【讨论】:

  • 你能解释一下吗
  • 我正在使用 DialogFragment 类。我应该如何转换它?
  • 你有一个包含 ListView 的 DialogFragment?
  • 好的,在这种情况下,我认为@Pedro Oliveira 解决方案是可行的方法
【解决方案3】:

您可以使适配器成为您活动的内部类:

protected void onCreate(Bundle savedInstanceState) {
    ListView listView;
    listView.setAdapter(new CustomAdapter(...));
}

private void activityMethod() {
    // Do something
}

/* Your custom adapter */
private class CustomAdapter extends ArrayAdapter<String> {

    public CustomAdapter(Context context, int resource) {
        super(context, resource);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ...

        holder.editDetails.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                activityMethod();
            }
        });

        ...
    }
}

然后你就可以从你的适配器调用你的活动了。

【讨论】:

    【解决方案4】:

    如果您的ActivityListActivity,您可以使用onItemClick

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    // TODO
    }
    

    【讨论】:

    • 它是一个对话框片段活动。
    【解决方案5】:

    这个监听器会为你提供一些关于点击视图的信息:

    public abstract void  onItemClick (AdapterView<?> parent, View view, int position, long id) 
    

    Doku

    一个不错的教程:http://www.ezzylearning.com/tutorial/handling-android-listview-onitemclick-event

    但是您为整个视图设置了侦听器,而不仅仅是按钮。

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2016-05-12
      相关资源
      最近更新 更多