活动类代码:

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会有问题吗?


当前回答

两个很棒的解决方案是,如果你从一个片段扩展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);
} 

其他回答

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

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

android:descendantFocusability="blocksDescendants"

还不够。你必须设置

android:textIsSelectable="false"

到你的textviews和

android:focusable="false"

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

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

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

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

设置根布局:android:descendantFocusability="blocksDescendants" 在这个项目中设置任何可聚焦或可点击的视图: android:点击= " 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>

在我的例子中,所有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布局中设置属性是一样的但这是唯一适用于我的情况。

这不是一个完美的时机,但也许会对某些人有所帮助 快乐的编码