Android如何从外部适配器识别Listview按钮单击事件?

时间:2014-10-23 09:15:17

标签: android listview

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

enter image description here

我想将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() {
   });

抱歉我的英语不好

5 个答案:

答案 0 :(得分:6)

您可以为其创建界面。将界面传递给适配器,并在单击按钮时调用它。

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
      }

创建适配器时,在活动上单击下一步,只需将侦听器传递给它:

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

答案 1 :(得分:2)

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

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();
            }
        });

        ...
    }
}

然后,您就可以从适配器调用您的活动。

答案 2 :(得分:1)

此侦听器为您提供有关所单击视图的若干信息:

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

Doku

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

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

答案 3 :(得分:1)

您可以在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);

答案 4 :(得分:1)

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

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