我有一个列表视图的麻烦。 其项目(行)具有的ImageButton。 的ImageButton有“安卓的onClick”所以这个onclick事件工作,但点击排不工作。 如果我从行项目中删除的ImageButton,点击排工程(ListView中有正确的onclick听者)。 我该如何解决呢? 我需要onclick事件当ImageButton的和非标准click事件,当用户选择行用户点击(不能点击的ImageButton但单击行)
我的列表视图:
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/restaurants_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@color/list_devider"
android:dividerHeight="1dp"
android:cacheColorHint="@color/list_background" />
不幸,
android:focusable="false"
android:focusableInTouchMode="false"
不适合工作ImageButton
。
我终于找到了解决办法在这里 。 在这些项目布局的xml,加
android:descendantFocusability="blocksDescendants"
到根视图。
它完美的ListView
具有ImageButton
秒。 根据官方参考 , blocksDescendants
指ViewGroup
将阻止它的后代从接收焦点。
您可以使用自定义适配器,为您的ListView(如果您还没有)。 还有,在getView(int position, View inView, ViewGroup parent)
的适配器的方法做这样的事情:
@Override
public View getView(int position, View inView, ViewGroup parent) {
View v = inView;
ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview
if (v == null) {
LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) v.findViewById(R.id.ImageView);
v.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) v.getTag();
}
.....
viewHolder.image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Click on imageView
}i
});
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Click on listView row
}
});
.....
return (v);
}
见这里如果你需要帮助创建你的自定义适配器。
如果ListView控件的一排有一个像任何可点击的元素Button
, Image
..etc..then onItemClick
将无法正常工作。 所以,你需要写点击监听getView
列表适配器。
更多阅读此 。
设置这些属性为您的按钮:
android:focusable="false"
android:focusableInTouchMode="false"
或者你可以在你的适配器类动态地设置:
yourButton.setFocusable(false);
yourButton.setFocusableInTouchMode(false);
并确保您设置的选择模式单一的列表视图:
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
就我而言, android:descendantFocusability="blocksDescendants"
主层没有工作,没有在ListView。 我也试过android:focusable="false" android:focusableInTouchMode="false"
,我听说,这是工作的按钮,但我的ImageButton所以也没。
但设置在布局的CS文件中的按钮的特性工作。
var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;
如果某行有多个可点击元素,onItemClick()将无法工作。 您将需要设置OnClickListener
在getView()
方法。 存储听众的视图的标记,以便它们可以被回收,方法添加到您的听众,使他们可以专门针对不同的行。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
RowClickListeners listeners = (RowClickListeners) view.getTag();
if (listeners == null) {
listeners = new RowClickListeners();
}
// Row click listener:
RowClickListener onClickListener = listeners.rowClickListener;
if (onClickListener == null) {
onClickListener = new RowClickListener();
listeners.rowClickListener = onClickListener;
}
onClickListener.setToPosition(pos);
view.setOnClickListener(onClickListener);
// Overflow listener:
View btn = view.findViewById(R.id.ic_row_btn);
ButtonListener btnListener = listeners.buttonClickListener;
if (rowListener == null) {
btnListener = new ButtonListener(activity);
listeners.rowClickListener = btnListener;
}
btnListener.setToPosition(pos);
btnListener.setCollection(collectionId);
btn.setOnClickListener(btnListener);
}
public static class RowClickListeners {
public RowClickListener rowClickListener;
public ButtonListener buttonClickListener;
}
上面没有唯一的答案为我工作,而是一种组合一样。
我现在设置android:descendantFocusability="blocksDescendants"
在ListView和android:focusable="false" android:focusableInTouchMode="false"
关于在XML 和 Java中我还设置了ImageButtons descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)
的ListView和focusable(false), focusableInTouchMode(false), clickable(true)
的ImageButtons。