0

私はlistViewを持っています。行の1つのコンポーネントはTextViewです。デフォルトでは、TextView に 2 行のテキストのみを表示したいと考えています。しかし、ユーザーが TextView をタップすると、textView をコンテキストで展開したいと考えました。

私は実際にこの部分を機能させていますが、より多くのコンテンツインジケーターが必要です:

ここに画像の説明を入力

私の現在の実装(以下)には、リストビューがスクロールされた場合に折りたたまれないという独自の問題がありますが、各カーソルレコードの値をコレクションに保存することでそれを処理します..

chatBubble.getLineCount() を使用してみましたが、最初はゼロを返します b/c (私の理解では) onLayout を通過していません。

2行以上のコンテンツがある場合にのみ表示したい.

私のソリューションは、私の要件の一部を処理できる TextView の独自の実装を作成することになると思いますが、誰かが私が見ることができる例を持っているかどうかはわかりません.. (または他の提案)。

   <RelativeLayout
        android:id="@+id/linear_layout_row_three"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linear_layout_row_two"
        android:layout_toRightOf="@+id/munzeeQuickContact"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/chat_bubble"
            android:clickable="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="2"
            android:background="@drawable/chat_bubble"
            android:text="I went looking for this particular token on a rainy day, and I was unable to locate it due to the bad weather, next time please leave an um I went looking for this particular munzee on a rainy day, and I was unable to locate it due to the bad weather, next time please leave an um" />
        <ImageView 
            android:id="@+id/minimize_maximize"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@id/chat_bubble"
            android:layout_alignRight="@id/chat_bubble"
            android:visibility="gone"
            android:src="@android:drawable/ic_menu_more"/>
    </RelativeLayout>

ここに私が現在持っているソースのいくつかがあります:

final TextView chatBubble = (TextView) view.getTag(R.id.chat_bubble);
        final ViewGroup expandableContainer = (ViewGroup) view.getTag(R.id.linear_layout_row_three);
        final ImageView minimizeMaximize = (ImageView) view.getTag(R.id.minimize_maximize);
        chatBubble.setOnClickListener(

                new View.OnClickListener() {
                    boolean isExpanded = false;
                    int lastHeight = 0;
                    // This is for the auto expanding text view
                    @Override
                    public void onClick(View v) {
                        if (isExpanded) {
                            ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) expandableContainer
                                    .getLayoutParams();

                            params.height = lastHeight;
                            chatBubble.setMaxLines(2);

                            expandableContainer.setLayoutParams(params);
                            expandableContainer.invalidate();
                            minimizeMaximize.setVisibility(View.VISIBLE);
                        } else {
                            lastHeight = expandableContainer.getHeight();

                            ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) expandableContainer
                                    .getLayoutParams();

                            params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
                            chatBubble.setMaxLines(99);

                            expandableContainer.setLayoutParams(params);
                            expandableContainer.invalidate();
                            minimizeMaximize.setVisibility(View.VISIBLE);
                        }

                        isExpanded = !isExpanded;

                    }
                });
4

1 に答える 1

2

私の解決策は、私の要件のいくつかを処理できるTextViewの独自の実装を作成することになると思いますが、誰かが私が見ることができる例を持っているかどうかはわかりません。

以下のクラスをご覧ください。

public class LimitedTextView extends TextView {

    private boolean mStatus;

    public LimitedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Paint p = getPaint();
        String s = getText().toString();
        if (s != null && !s.equals("")) {
            int m = (int) p.measureText(s);
            if (m < getMeasuredWidth() * 2) {
                modifyParent(true);
            } else {
                modifyParent(false);
            }
        }
    }

    private void modifyParent(boolean how) {
        RelativeLayout rl = (RelativeLayout) getParent();
        rl.findViewById(R.id.minimize_maximize).setVisibility(
                how ? View.GONE : View.VISIBLE);
        if (mStatus) {
            setMaxLines(40); // arbitrary number, set it as high as possible
        } else {
            setMaxLines(2);
        }
    }

    public void storeCurrentStatus(boolean status) {
        mStatus = status;
    }

}

LimitedTextView、独自のPaintオブジェクトを使用してテキストを測定し、測定された幅に対してテストします。許可された2つの行に収まる場合は非表示になりImageView、そうでない場合は表示されます。また、行の現在のステータス(拡張/非拡張)を格納し、最大行数を増減して適切な外観を取得します。アダプタのgetView方法では、次のようにします。

  • テキストを設定する
  • 位置に応じてブール配列からステータスを設定します(これは、リストをスクロールするときに行を順番に保持するためにも必要です)。

    textView.storeCurrentStatus(mStatus[position])

  • それ自体にを設定し、OnClickListenerそこLimitedTextViewからステータスを更新します。

    mStatus[(Integer) v.getTag()] = !mStatus[(Integer) v.getTag()];
    notifyDataSetChanged();
    
  • 同じブール配列に基づいて、mStatusのドローアブルを変更して、が展開さImageViewれているかどうかに応じて異なるものを表示する可能性がありますTextView

手動で書いたので、今見落としている間違いがあるかもしれませんので、考えてみてください。パフォーマンスのLimitedTextView場合と同様に改善される可能性があります。また、テキストの拡張をアニメーション化する場合に、どの程度適切に動作するかわかりません。

于 2012-12-29T15:07:46.457 に答える