0

似たような投稿がたくさんあることは知っていますが、ここではすべてが正しいように見えます。

カスタム ウィジェット:

public class DoubleTextItem extends LinearLayout {

private TextView txtMain;
private TextView txtDescription;

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

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    ((Activity)getContext()).getLayoutInflater().inflate(R.layout.widget_double_text_item, this);
    setupViewItems();
}

private void setupViewItems() {
    txtMain = (TextView) findViewById(R.id.txtMain);
    txtDescription = (TextView) findViewById(R.id.txtDecription);
}
public void setDescription(String text) {
    txtDescription.setText(text);
}
}

カスタム ウィジェット レイアウト xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

    <TextView
    android:id="@+id/txtMain"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

    <TextView
    android:id="@+id/txtDecription"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

ここで、アクティビティ関数内でキャスト エラーが発生します。

LayoutInflater inflater = LayoutInflater.from(this);
DoubleTextItem item = (DoubleTextItem) inflater.inflate(R.layout.widget_double_text_item, layout);              
item.setText(som-txt);
item.setDescription("#"+athlete.getString("position"));
4

1 に答える 1

2

ここでは、ルート ビューは LinearLayout ですが、カスタム クラスにキャストしようとしています。

DoubleTextItem item = (DoubleTextItem) inflater.inflate(R.layout.widget_double_text_item, layout);              

標準的なアドバイスは次のとおりです。

すべての DoubleTextItems は LinearLayouts ですが、すべての LinearLayouts が DoubleTextItems であるわけではありません。

オブジェクトを LinearLayout から DoubleTextItem にダウンキャストできないことを意味します。仮定が多すぎるため、Java ではそれができません。

レイアウトに DoubleTextItem が必要な場合は、次を使用する必要があります。

<your.package.name.DoubleTextItem 
    ... />

(また、インフレートしたアイテムを保存しないので、内部でインフレートを呼び出すonFinishInflate()のは少しばかげているように思えます...別のレイアウトをインフレートしたい場合は、最初のものをインフレートしないでください。)


全体として、非推奨になったTwoLineListItemを再作成しようとしているように見えます。おそらく、そのソース コードからいくつかのポインターを学習できます(または単に TwoLineListItem を使用します)。

于 2013-02-10T21:10:07.917 に答える