17

インフレーション(アプリケーションコンテキストを介してテキストビューを直接識別する)を使用しない場合、(item.xml)のカスタムxmlを設定しようとしているリストアダプターがありますが、リストビューは完全に機能しません。テーマ..

public View getView(int position, View convertView, ViewGroup parent) {
        //System.gc();
        TextView tv;

        LayoutInflater inflater = getLayoutInflater();

        View row = View.inflate(mContext,R.layout.item,null); //.inflate(R.layout.item, parent, false); doesnt work either..
        String id = null;
        if (convertView == null) {
            tv =  (TextView) row.findViewById(R.id.TextView01);;
        } else
            tv = (TextView) convertView;

[..]

logcat私はこれを手に入れています。

    07-15 19:45:51.710: ERROR/AndroidRuntime(20185): FATAL EXCEPTION: main
        java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
        at android.widget.ListView.setupChild(ListView.java:1827)
        at android.widget.ListView.makeAndAddView(ListView.java:1794)
        at android.widget.ListView.fillDown(ListView.java:688)

私のitem.xmlファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_height="wrap_content"
          android:gravity="left|center"
          android:layout_width="fill_parent"
          android:paddingBottom="15px"
          android:background="#fff200"
          android:paddingTop="15px"
          android:paddingLeft="15px">

<TextView android:id="@+id/TextView01"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:textSize="40px"
          android:textStyle="bold"
          android:layout_marginLeft="20px"
          android:textColor="#0099CC">
</TextView>
</LinearLayout>
4

6 に答える 6

36

この問題は、アダプターから返されるコントロールを線形レイアウトでラップすることによって発生します。レイアウト ファイルから LinearLayout を失い (TextView をルートとして配置するだけ)、動作するはずです。

少し拡大するには: コントロールを作成してから、それを LinearLayout に追加します。この時点で LinearLayout$LayoutParams オブジェクトが割り当てられ、そのレイアウト パラメータとして設定されます。次に、それをリニア レイアウトから引き出して、LinearLayout$LayoutParams を認識しないリスト ビューに配置します。

または、tv を返すのではなく、getView から行を返します (引用されたコードから戻り行を切り取ったため、現在行っていると思われます)。

(別の無関係なヒント: convertView != null の場合、レイアウトを膨張させてから破棄します。これにより、遅いデバイスではスクロールのパフォーマンスが低下します。実際に必要な場合にのみ、膨張を実行してください。)

于 2012-07-15T16:20:39.023 に答える
20

あなたはおそらく列の代わりにテレビを返しています

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

    LayoutInflater inflater = getLayoutInflater();
    View row = View.inflate(mContext,R.layout.item,null);
    String id = null;
    if (convertView == null) {
        tv =  (TextView) row.findViewById(R.id.TextView01);;
    } else
        tv = (TextView) convertView;
    }
 return row;  // returning tv brings to ClassCast!
于 2012-09-09T11:58:17.233 に答える
5

レイアウト インフレータを使用して静的 xml レイアウトをインフレートしようとしましたか? このような:

LayoutInflater li = LayoutInflater.from(context);
View rootView = li.inflate(R.layout.item, null);
于 2012-07-15T14:38:24.647 に答える
0

コードで ArrayAdapter の getView を使用する適切な方法は次のとおりです。

public View getView(int position, View convertView, ViewGroup parent) {
    //System.gc(); // Should not manually call gc
    View row;
    LayoutInflater inflater = getLayoutInflater();
    if (convertView == null) {
        row = inflater.inflate(R.layout.item, parent, false);
    } else
        row = convertView;

    TextView tv = (TextView) row.findViewById(R.id.TextView01);

また、可能であれば、コード内で手動でガベージ コレクションを行わないでください。

于 2012-07-15T14:34:12.957 に答える