在我相当复杂的视图布局中,我遇到了一个奇怪的问题。 (我将在解释中尝试简化一下)

基本上我有一个ListView,其中每个项目都包含一个TextViewImageButton。我可以单击列表项(在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/

10-12 03:59