在我相当复杂的视图布局中,我遇到了一个奇怪的问题。 (我将在解释中尝试简化一下)
基本上我有一个ListView
,其中每个项目都包含一个TextView
和ImageButton
。我可以单击列表项(在textview上)或按钮(我将ImageButton设置为不可聚焦,否则它将无法工作)
现在它似乎可以正常工作,直到我打开另一个窗口并返回到列表视图。
从那时起,我可以单击ImageButton而不会发生任何事情(单击期间甚至背景都不会改变)。但是,当我再次单击TextView时,将立即分派ImageButton中的所有click事件。
这是为什么?
编辑:
列表项:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="0px"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingLeft="2px"
android:paddingRight="2px"
>
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Text"
android:textSize="19dp"
android:paddingTop="4px"
android:paddingBottom="4px"
android:layout_gravity="center_vertical"/>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/open_subtree_layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="0px"
android:orientation="horizontal"
android:padding="0px">
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@drawable/separator_line" />
<com.treeviewer.leveldisplay.DontPressWithParentImageButton
android:id="@+id/btn_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="@drawable/list_selector_background"
android:focusable="false"
android:focusableInTouchMode="false"
android:padding="10dp"
android:src="@drawable/arrow_right" />
</LinearLayout>
</LinearLayout>
那就是它膨胀的方式:
[...]
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = inflater.inflate(R.layout.tree_row, null, false);
TextView textView = (TextView)mView.findViewById(R.id.text1);
LinearLayout nextNodeButtonContainer = (LinearLayout)mView.findViewById(R.id.open_subtree_layout);
if(childCount >= 0) {
titleBuilder.append(" (" + childCount + ")");
nextNodeButtonContainer.setVisibility(View.VISIBLE);
View button = nextNodeButtonContainer.findViewById(R.id.btn_right);
button.setFocusable(false);
button.setFocusableInTouchMode(false);
//button.setClickable(true);
button.setOnClickListener(clickListener);
button.setTag(tagValue);
} else {
nextNodeButtonContainer.setVisibility(View.GONE);
}
textView.setText(titleBuilder);
让我知道,如果您需要更多代码。
最佳答案
好的,我终于解决了这个问题。
不幸的是,在我的问题中,我没有提供解决问题的必要信息,因为问题出在我没想到的地方:
我有一个ListAdapter
,其中的getView方法看起来像这样:
public View getView(int position, View convertView, ViewGroup parent) {
return mNodes.get(position).getView(mNodeArrowClickListener, position);
}
节点(
getView
s)的TreeLevelElement
方法如下所示:public class TreeLevelElement {
private final Context mContext;
private View mView = null;
//[...] other methods
View getView(OnClickListener clickListener, final int tagValue) {
if(mView == null) {
//[...] produce a new View from XML
}
return mView;
}
}
问题是,我将视图存储在我的元素中,所以我猜想这与android策略在将旧视图重用于新项目时以某种方式冲突。
我不知道到底发生了什么,但是现在我删除了
mView
并每次都创建一个新的,它可以工作。我还将更改它以重新使用
convertView
。关于android - 单击ImageButton上的事件不会立即分派(dispatch),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8275035/