在我相当复杂的视图布局中,我遇到了一个奇怪的问题。 (我将在我的解释中尝试简化它)
基本上我有一个ListView
,其中每个项目都包含TextView
和ImageButton
。我能够单击列表项(在textview上)或按钮(我将ImageButton设置为不可聚焦,否则它将无法工作)
现在看起来工作正常,直到我打开另一个窗口并返回列表视图。 从那时起,我可以单击ImageButton而不会发生任何事情(甚至在点击期间背景都没有变化)。但是当我再次单击TextView时,会立即调度ImageButton中的所有点击事件。
为什么?
编辑:
清单项目:
<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);
如果您需要更多代码,请与我们联系。
答案 0 :(得分:0)
好的,我终于解决了这个问题。
不幸的是,在我的问题中,我没有提供必要的信息来解决它,因为问题出现在我没想到的地方:
我有一个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
。