OnItemCLickListener 不能在 listview 中工作

Activity类代码:

conversationList = (ListView)findViewById(android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new  ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Log.d("test","clicked");
}
});

Adapter类中的 getView函数:

if (v == null) {
LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(leftSideMessageNumber.equals(m.getTo())) {
v = vi.inflate(R.layout.conversation_list_item_format_left, null);
} else {
v = vi.inflate(R.layout.conversation_list_item_format_right, null);
}
}

在充气时使用两个 xml 有什么问题吗?

139218 次浏览
问题是你的布局包含可聚焦或可点击的项目。 如果视图包含可聚焦或可点击的项,OnItemCLickListener将不会被调用

点击在这里查看更多信息。

如果不是这样的话,请发布一个你的布局xml。

我刚从这里找到了一个解决方案,不过是通过深度点击。

如果列表中的任何行项包含可聚焦或可单击的视图,则OnItemClickListener将不起作用。

row项必须有一个类似的参数 android:descendantFocusability = "blocksDescendants" . < / p > 在这里你可以看到你的列表项应该是什么样子的例子。 你的列表项xml应该是… row_item.xml (your_xml_file.xml) < / p >

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:descendantFocusability="blocksDescendants"
android:gravity="center_vertical" >


// your other widgets here


</LinearLayout>

对于我的列表,我的行有其他可以点击的东西,比如按钮,所以做一个毯子blocksDescendants是行不通的。相反,我在按钮的xml中添加了一行:

    android:focusable="false"

这样可以防止按钮阻塞对行的单击,但仍然允许按钮接受单击。

在列表视图的自定义行布局中使用下面的代码

 android:focusable="false"
android:clickable="false"

我也遇到了同样的问题,尝试了所有提到的解决方案都无济于事。通过测试,我发现使文本可选会阻止侦听器被调用。通过将它切换为false,或者删除它,我的监听器再次被调用。

android:textIsSelectable="false"

希望这能帮助像我这样被困住的人。

我也遇到了同样的问题,我只是看到我不小心设置了:

@Override
public boolean isEnabled(int position)
{
return false;
}

在CustomListViewAdapter类上。

将其更改为:

return true;
我已经设法解决了这个问题。 如果有人犯了同样的错误,

.

使用android: descendantFocusability

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dip"
android:background="@color/light_green"
android:descendantFocusability="blocksDescendants" >

在根布局中添加上述内容

如果你有文本视图,按钮或STG可点击或选择在你的行视图

android:descendantFocusability="blocksDescendants"

还不够。你必须设置

android:textIsSelectable="false"

到你的textviews和

android:focusable="false"

到您的按钮和其他可对焦的项目。

即使我有同样的问题,我有复选框,做下面的掩码itemClickListener工作,

在复选框中添加以下属性,

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"

ItemClickListner开始工作。

详细的例子你可以点击链接,

http://knowledge-cess.com/android-itemclicklistner-with-checkbox-or-radiobutton/ < a href = " http://knowledge-cess.com/android-itemclicklistner-with-checkbox-or-radiobutton/ " > < / >

希望能有所帮助,干杯!!

您需要在listview_item.xml中执行2步

  1. 使用android:descendantFocusability="blocksDescendants"设置根布局
  2. 在这个项目中设置任何可聚焦或可点击的视图:
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"
    < / >

下面是一个例子:listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center_vertical"
android:orientation="vertical"
android:descendantFocusability="blocksDescendants">


<RadioButton
android:id="@+id/script_name_radio_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textColor="#000"
android:padding="5dp"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
/>


</LinearLayout>

两个很棒的解决方案是,如果你从一个片段扩展ListFragment,知道mListView.setOnItemClickListener不会在你的活动创建之前被调用,这确保它是在活动创建时设置的

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mListView.setOnItemClickListener(new OnItemClickListener() {


@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
// Do the onItemClick action


Log.d("ROWSELECT", "" + rowId);
}
});
}

在查看ListFragment的源代码时,我发现了这个

public class ListFragment extends Fragment {
...........................................
................................................


final private AdapterView.OnItemClickListener mOnClickListener
= new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
onListItemClick((ListView)parent, v, position, id);
}
};


................................................................
................................................................


public void onListItemClick(ListView l, View v, int position, long id) {
}
}
onItemClickListener对象被附加并调用onListItemClick() 因此,其他类似的解决方案,以完全相同的方式工作是覆盖onListItemClick()

@Override
public void onListItemClick(ListView l, View v, int position, long rowId) {
super.onListItemClick(l, v, position, id);
// Do the onItemClick action


Log.d("ROWSELECT", "" + rowId);
}

我已经尝试了以上所有的方法,但都没有效果。

我的解决方法如下:

首先定义一个名为ListButton的自定义按钮

public class ListButton extends android.widget.Button
{


private ButtonClickedListener clickListener;


public ListButton(Context context)
{
this(context, null);
}


public ListButton(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}


public ListButton(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}


public void setClickListener(ButtonClickedListener listener) {
this.clickListener = listener;
}


@Override
public boolean isInTouchMode() {
return true;
}


@Override
public boolean onTouchEvent(MotionEvent event) {


return false;
}


@Override
public boolean dispatchTouchEvent(MotionEvent event) {


switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:


eventClicked();


break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_MOVE:
break;
default :


}
return true;
}


private void eventClicked() {
if (this.clickListener!=null) {
this.clickListener.ButtonClicked();
}
}


}

XML看起来像:

<dk.example.views.ListButton
android:id="@+id/cancel_button"
android:layout_width="125dp"
android:layout_height="80dp"
android:text="Cancel"
android:textSize="20sp"
android:layout_margin="10dp"
android:padding="2dp"
android:background="#000000"
android:textColor="#ffffff"
android:textStyle="bold"
/>

然后定义自己的ButtonClicked Listener接口:

public interface ButtonClickedListener {
public void ButtonClicked();
}

然后我使用自己的侦听器,就像它是正常的OnClickListener一样:

final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button);


cancelButton.setClickListener(new ButtonClickedListener() {


@Override
public void ButtonClicked() {
//Do your own stuff here...
}


});

如果你想同时使用简单点击和长时间点击列表视图项,更好的实现方式是使用上下文菜单长时间点击。避免使用setItemLongClickListener,特别是当你的列表视图有多行布局时。

面对同样的问题,试了几个小时。如果你已经尝试了以上所有的,尝试改变Listview的layout_width和列表项的match_parent从wrap_content。

我在这个答案的帮助下解决了它

< p > 1。在“list_items.xml的线性布局”中添加如下内容 android:descendantFocusability="blocksDescendants" < / p >

2.list_items.xml中线性布局的子视图

 android:focusable="false"

以上这些对我来说都失败了。然而,我能够解决这个问题(经过几个小时的敲击我的头-谷歌,如果你在听,请考虑修复我在编译器错误的形式,如果可能的话)

你真的需要小心你添加到xml布局的android属性(在这个原始问题中,它被称为list_items.xml)。对我来说,导致问题的原因是我已经从EditText视图切换到TextView,并且从更改中有剩余的属性cruft(在我的情况下,inputType)。编译器没有捕捉到它,当我去运行应用程序时,可点击性刚刚失败。再次检查你在布局xml节点中拥有的所有属性。

  1. 将此添加到主布局中

    android:descendantFocusability="blocksDescendants"
    
  2. Write this code into every button,Textview,ImageView etc which have onClick

    android:focusable="false"
    
    
    android:clickable="false"
    

Hope it will work.

Android:autoText属性也使TextView可自动聚焦。

在我的例子中,所有XML布局属性都是有用的。

我只是添加了一行代码,像这样: convertView.setClickable(假);< / >强

@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null || convertView.getTag() == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.my_layout_id, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
...
convertView.setClickable(false);
return convertView;
}

基本上它做的事情和在XML布局中设置属性是一样的但这是唯一适用于我的情况。

这不是完美的时机,但也许会对某人有所帮助 快乐编码< / p >

我也有同样的问题,我在行布局中使用了具有“可聚焦”属性的文本样式。我把它取下来后它还能用。

private AdapterView.OnItemClickListener onItemClickListener;


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


final View view = convertView;
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(null, view, position, -1);
}
}
});


return convertView;
}


public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}

然后在活动中,在将adapter.setOnItemClickListener ()附加到列表视图之前使用它。

github复制它为我工作

对我有用的是将下面的代码添加到我的row.xml文件布局中的每个子视图中:

android:focusable="false"
android:focusableInTouchMode="false"

在我的例子中:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">




<TextView
android:focusable="false"
android:focusableInTouchMode="false"
android:id="@+id/testingId"
android:text="Name"
//other stuff
/>


<TextView
android:focusable="false"
android:focusableInTouchMode="false"
android:id="@+id/dummyId"
android:text="icon"
//other stuff
/>


<TextView
android:focusable="false"
android:focusableInTouchMode="false"
android:id="@+id/assignmentColor"
//other stuff
/>


<TextView
android:focusable="false"
android:focusableInTouchMode="false"
android:id="@+id/testID"
//other stuff
/>


<TextView
android:focusable="false"
android:focusableInTouchMode="false"
android:text="TextView"
//other stuff
/>


</android.support.constraint.ConstraintLayout>

这是我在Fragment子类中的setOnItemClickListener调用:

CustomListView = (PullToRefreshListCustomView) layout.findViewById(getListResourceID());
CustomListView.setAdapter(customAdapter);
CustomListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {


@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("Testing", "onitem click working");
//  other code
}


});

我从在这里得到答案!

在我的例子中,我必须从Layout中删除下一行

android:clickable="true"

我通过从列表中删除可点击的视图来解决这个问题。

onClick也有同样的问题。解决方案是从xml中删除以下内容

android:tooltipText=""