1

親LinearLayoutに存在するTextViewのonClickListenerを使用して、子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:ListViewにデータを入力するためのカスタムArrayAdapterを作成しました。

4

2 に答える 2

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 に答える
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は、アレイをリセットする必要があります。

編集:

もう1つのオプションは、現在のレイアウトファイルを2つに分割しExpandableListView、非表示のレイアウトが子ビューである場所を使用することです。

于 2012-08-25T06:22:21.127 に答える