1

我正在尝试使用 onClickListener 为父 LinearLayout 中存在的 TextView 切换子 LinearLayout 的可见性。有人可以帮我实现这一目标吗?

以下是我的布局文件的一部分:

<LinearLayout android:id="@+id/main_space"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_weight="10"
    android:padding="2dp">
    <TextView android:id="@+id/currentUserHeader"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="@dimen/currentuserheader_textsize"
        android:textColor="@color/currentuserheader_textcolor"/>
    <TextView android:id="@+id/currentUserBody"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="@dimen/currentuserbody_textsize"
        android:textColor="@color/currentuserbody_textcolor"
        android:clickable="true"
        android:onClick="toggleUserActionBar"/>
    <LinearLayout android:id="@+id/useractions"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:visibility="gone"
        android:background="@color/useractions_background">
        <TextView android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Save"
            android:textColor="@color/useractions_label"
            android:textSize="@dimen/useractions_textsize"
            android:layout_weight="1"
            android:gravity="center"/>
        <TextView android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Delete"
            android:textColor="@color/useractions_label"
            android:textSize="@dimen/useractions_textsize"
            android:layout_weight="1"
            android:gravity="center"/>
        <TextView android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Forward"
            android:textColor="@color/useractions_label"
            android:textSize="@dimen/useractions_textsize"
            android:layout_weight="1"
            android:gravity="center"/>
    </LinearLayout>
</LinearLayout>

当我单击 TextView“currentUserBody”时,我想切换该文本视图正下方的 LinearLayout“useractions”的可见性。

这个布局实际上是 ListView 中一行的布局。所以我希望这个功能适用于该 ListView 中的每一行。用户可以简单地点击文本,它应该在文本下方打开选项以快速执行这些操作。

你能帮我实现这个吗?

PS:我创建了一个自定义 ArrayAdapter 来填充 ListView。

4

2 回答 2

2

getView这是执行您想要的方法的示例:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // do the normal thing you would do, inflate stuff, use the view holder pattern etc 
    // set as the tag for the clickable TextView the current position
    ((TextView) convertView.findViewById(R.id.currentUserBody)).setTag(Integer.valueOf(position));
    // set the listener for the TextView
    ((TextView) convertView.findViewById(R.id.currentUserBody)).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // retrieve the position value
            Integer realPos = (Integer) v.getTag();
            // get the parent and then search for the useractions LinearLayout
            View hiddingLayout = ((LinearLayout) v.getParent()).findViewById(R.id.useractions);
            // modify a status holder with the new value
            status[realPos] = !status[realPos];
            // change the visibility 
            hiddingLayout.setVisibility(status[realPos] ? View.VISIBLE : View.GONE);
        }
    });
    // this is required so we don't mess up the rows with visible/gone layouts 
    convertView.findViewById(R.id.useractions).setVisibility(status[position] ? View.VISIBLE : View.GONE);
    return convertView;
}

status数组是一个boolean数组,它将保存每一行的可见性状态(false值表示GONEVISIBLE否则)。您将根据数据的大小在构造函数中创建此数组。如果您打算调用notifyDataSetChanged适配器,则需要重置阵列。

编辑:

另一种选择是将当前布局文件分成两部分并使用ExpandableListView隐藏布局是子视图的位置。

于 2012-08-25T06:22:21.127 回答
2

一个快速而肮脏的解决方案可能是:

public void toggleUserActionBar(View v) {
    View actions = v.getParent().findViewById(R.id.useractions);
    if(actions.getVisibility() == View.VISIBLE) {
         actions.setVisibility(View.GONE);
    } else {
         actions.setVisibility(View.VISIBLE);
    }
}

一个更干净的解决方案是在自定义视图中扩展项目布局,它可以在内部处理所有这些。

于 2012-08-25T01:50:07.980 回答