3

次のようViewに派生させようとしているカスタム集計があります。RelativeLayout

public class CheckableView extends RelativeLayout implements Checkable {

TextView        mTextView;
boolean         mIsChecked = false;
int             mId = 0;

public CheckableView(
        Context context, 
        AttributeSet attrs, 
        int defStyle,
        int resource, 
        int textViewResourceId) throws Exception {

    super(context, attrs, defStyle);
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (inflater != null) {
        inflater.inflate(resource, this);
        this.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        mTextView = (TextView) findViewById(textViewResourceId);
        if (mTextView == null) {
            throw new Exception("The specified TextView resource Id was not found.");
        }
    }
}
}

resourceパラメータは、これを集約しidたいレイアウトの であり、ステータスをグラフィカルに示す(チェックマークを付ける)の id です。CheckableViewtextViewResourceIdTextViewchecked

この xml は次のように定義されます。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content">

<TextView
    android:id="@+id/itemslist_categoryName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_alignParentLeft="true"
    android:text="@string/app_name" />

<LinearLayout
    android:id="@+id/category_details_price"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@+id/addedit_category_check"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/addedit_category_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="right|center_vertical"
        android:text="@string/app_name" />

    <TextView
        android:id="@+id/addedit_category_price_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="right|center_vertical"
        android:text="@string/app_name" />

</LinearLayout>

</RelativeLayout>

このカスタムビューを特定の各行として使用したいので、アダプターのListView他の場所で、次のようにします。ListViewgetView

    public View getView(int position, View convertView, ViewGroup parent) {

        CheckableView view = null;

        if (convertView == null) {
            try {
                view = new CheckableView(getContext(), 
                                                   null, 
                                                   0, 
                                                   R.layout.addedit_group_budget, 
                                                   R.id.addedit_category_check);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            view = (CheckableView) convertView;
        }

        ...
        return view;
    }

の各行には、ListView長さが異なるテキストがあります。ビューが最初に作成されたときは、すべて問題ないように見えますが、ビューがリサイクルされ始めたとき (つまり、上下にスクロールしたとき)。幅を指定しても、テキストのTextViewsサイズに合わせてサイズが変更されないようです。wrap_content

何が欠けている可能性がありますか?以下のスクリーンショットの例。明らかにテキストを追加する余地があるにもかかわらず、一部のテキストが省略されていることに注意してください。

より多くのスペースがあるにもかかわらず、テキストの省略記号

クラス定義から削除するimplements Checkableと、期待どおりに動作し、これが関係していることを示しています。

4

1 に答える 1

2

実際の犯人は、setCompoundDrawablesWithIntrinsicBoundsTextView の 1 つで作成していた API であることがわかりました。この API を呼び出すと、親レイアウト内のビューの測定に大混乱が生じるようです。この問題は美しく明確に表現されています @ 同じ背景を持つ複数のビューで setCompoundDrawablesWithIntrinsicBounds を呼び出すと、サイズに一貫性がなくなります

「チェック済み」状態を示す適切なアイコンを設定した ImageView を使用して、この問題を回避することができました。

于 2012-10-30T18:56:40.173 に答える