Android自定义ListViewAdapter使用setOnClickListener不会引发listView.setOnItemClickListener

时间:2013-07-21 09:06:02

标签: android

我创建自定义ListViewAdapter

在适配器中我使用setOnClickListener

public View getView(int position, View convertView, ViewGroup parent)

LayoutInflater inflater = ((Activity)context).getLayoutInflater();

row = inflater.inflate(layoutResourceId, parent, false);

row.setOnClickListener(new View.OnClickListener() {})

在活动中我创建了listview

listView.setAdapter(new MyAdaper(this));

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

但是如果使用setOnClickListener

,则不会引发setOnItemClickListener

如果注释setOnClickListener setOnItemClickListener raise

如何使这项工作,以及setOnClickListener和setOnItemClickListener?

2 个答案:

答案 0 :(得分:1)

如果您使用自定义listAdapter,您可以将onclickListener设置为您的基本视图中的子视图(在您的示例中 - 行);在调用堆栈中,listView.setOnItemClickListener位于row.setOnclickListener之上。实际上两者都给出了相同的结果,因为(在此上下文中)是默认ListView中的一个简单项。

在这种情况下解决方案是:

public View getView(int position, View convertView, ViewGroup parent)
{
    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
    row = inflater.inflate(layoutResourceId, parent, false);        
    ((Button)row.findViewById(R.id.btn1)).setOnClickListener(new View.OnClickListener() {});
}

在上面的示例中,我使用xml文件,如listView.layoutResourceId项包含一个Button(R.id.btn1)。之后,您可以将Click侦听器设置为ListView和Button.And它将是不同的侦听器,它们将产生不同的\相同的结果(这完全取决于实现)

答案 1 :(得分:0)

我找到了下一个方法(感谢Raghunandan关于“你不能同时拥有”)

在适配器

private android.view.View.OnClickListener onClickListener;
public void setOnClickListener(android.view.View.OnClickListener l) {
    onClickListener = l;
}

private android.view.View.OnLongClickListener onLongClickListener;
public void setOnLongClickListener(android.view.View.OnLongClickListener l) {
    onLongClickListener = l;
}

public View getView(int position, View convertView, ViewGroup parent) {
    row.setOnClickListener(new View.OnClickListener() {
        //My action
        if (onClickListener != null)
            onClickListener.onClick(view);
    })
}
row.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        //My action
        if (onLongClickListener != null)
            return onLongClickListener.onLongClick(view);

            return true;
    }
});