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

Android如何从外部适配器识别Listview按钮点击事件?,android,listview,Android,Listview,我有一个自定义的listview,它将按钮作为一个项目 我想将侦听器设置为此按钮。目前,我正在适配器中使用以下代码来识别它 holder.editDetails.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //rowItem.getUserID(); Toast.makeText

我有一个自定义的listview,它将按钮作为一个项目

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

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

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

            }
    });
在适配器外部(在Main.class中)是否有识别此按钮onclick事件的方法


对不起,我的英语很差

此听众向您提供了有关单击视图的一些信息:

public abstract void  onItemClick (AdapterView<?> parent, View view, int position, long id) 
public-abstract-void-onItemClick(AdapterView父视图、视图视图、整型位置、长id)

很好的教程:


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

您可以在活动中创建一个方法,如:

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

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

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;
}
接下来,在活动中创建适配器时,只需将侦听器传递给它:

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

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

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

        ...
    }
}
创建时受保护的void(Bundle savedInstanceState){
列表视图列表视图;
setAdapter(新的CustomAdapter(…);
}
私有无效活动方法(){
//做点什么
}
/*您的自定义适配器*/
私有类CustomAdapter扩展了ArrayAdapter{
公共CustomAdapter(上下文,int资源){
超级(上下文、资源);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
...
holder.editDetails.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
活动方法();
}
});
...
}
}

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

如果您的
活动
列表活动
,您可以使用
onItemClick

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO
}
@覆盖
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//待办事项
}

详细介绍了您为什么要这样做。你想从适配器访问活动吗?是的..这正是我想要的。你能解释一下吗?我使用DialogFragment类。我应该如何转换它?你有一个包含ListView的DialogFragment?好的,在这种情况下,我认为@Pedro Oliveira solution是进行对话片段活动的方式。我来晚了一点,但这很有用。非常感谢。
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();
            }
        });

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