2

findviewbyid() returns null別の質問へようこそ!

配列を ListView に表示するためのアダプター クラスを作成しました。そして、findviewbyid() が null を返すものを推測します。(このトピックに関する他のすべての質問を確認しましたが、私の問題とは関係ありません)。

だからここに私のアダプタークラスがあります:

package de.kosmowski.discogs.wants;

import java.util.ArrayList;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import de.kosmowski.discogs.model.Want;

public class WantAdapter extends ArrayAdapter<Want> {

private ArrayList<Want> items;

public WantAdapter(Context context, int textViewResourceId, ArrayList<Want> items) {
        super(context, textViewResourceId, items);
        this.items = items;
}


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

        Want w = items.get(position);
        Log.d("WantAdapter", "want:" + w);

        if (v == null) {
             LayoutInflater vi = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             if(w != null && w.getType()!= null && (w.getType().equals(Want.TYPE_RELEASE) || w.getType().equals(Want.TYPE_MASTER)))
             {
                 Log.d(this.getClass().getCanonicalName(), "Choosing Release List Item");
                 v = vi.inflate(R.layout.releaselistitem, null);
             }
             else
             {
                 v = vi.inflate(R.layout.lplistitem, null);
             }

        }

        if (w != null) {

                ImageView icon = (ImageView) v.findViewById(R.id.typeicon); //Returns NULL at this line

                TextView tt = (TextView) v.findViewById(R.id.text1);

                if(w.getType() != null)
                {
                    if(w.getType().equals(Want.TYPE_ARTIST))
                    {
                        icon.setImageResource(R.drawable.resulttype_artist);
                    }
                    else if(w.getType().equals(Want.TYPE_RELEASE))
                    {
                        icon.setImageResource(R.drawable.resulttype_lp);
                    }
                    else if(w.getType().equals(Want.TYPE_MASTER))
                    {
                        icon.setImageResource(R.drawable.resulttype_lp_master);
                    }
                    else
                    {
                        icon.setImageResource(R.drawable.defaultresult);
                    }
                }
                else
                {
                    icon.setImageResource(R.drawable.defaultresult);
                }



                if (tt != null) {
                      tt.setText(w.getName());                            }                    
        }
        return v;
}


}

null が返される行をマークしました。

そして、これが拡張された xml ファイルです (現在、lplistitem と releaselistitem はまったく同じです)。

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

  <ImageView android:scaleType="center" android:layout_gravity="center_vertical" android:src="@drawable/defaultresult" android:id="@+id/typeicon" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>

  <TextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/text1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:paddingLeft="6dip"
    android:textSize="16px"
    android:minHeight="?android:attr/listPreferredItemHeight"
/> 


</LinearLayout>

明らかなエラーが見られますか? 私にはすべてが正しいように思えます。

4

3 に答える 3

4

ですから、問題は本当に日食に関係していました。あなたが言ったことをすべてやり、手を骨までググった後、Eclipseが正しく機能しているかどうかを確認するのは良い考えかもしれないと思いました。

したがって、何らかの理由で、私に表示されたレイアウトファイルの日食は、コンパイルされていたファイルではありませんでした。そのため、Eclipseではすべてが正常に見えました。

次に、ファイルシステムで同じファイルを直接確認しましたが、これはまだ古いファイルでした。だから私はちょうど私のEclipseプロジェクトを更新し、古いファイルがEclipseに表示され、それを再度編集しました。それはそうでした。なぜこれが起こったのか分かりませんが、これは私を怖がらせます。日食に関するこれらの不透明な問題がもっとあるかもしれません。

私は数日前にそれに似たような問題を抱えていました。

AndroidOptionsMenuでRuntimeExceptionを参照してください

問題があったのは、新しいidリソースを追加した後にR.javaファイルが自動的に再コンパイルされなかったことです。

ここで、Eclipseのインストールをクリーンアップし、インストール中に大きな間違いが発生していないことを確認するために、すべてを最初からインストールします。

あなたの答えをありがとう!

于 2011-03-05T09:07:50.173 に答える
1

LayoutInflater 変数を使用するのではなく、レイアウトを 1 行でインフレートしようとします。また、適切なコンテキストが使用されていることを確認するために、コンテキストをプライベート変数として保存したくなるでしょう。だから、あなたのコードで私が別の方法でやろうとしていることは次のとおりです。

public class WantAdapter extends ArrayAdapter<Want> {

  private ArrayList<Want> items;
  private Context mContext;

public WantAdapter(Context context, int textViewResourceId, ArrayList<Want> items) {
        super(context, textViewResourceId, items);
        this.items = items;
        mContext = context;
}

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

    Want w = items.get(position);
    Log.d("WantAdapter", "want:" + w);

    if (v == null) {
         if(w != null && w.getType()!= null && (w.getType().equals(Want.TYPE_RELEASE) || w.getType().equals(Want.TYPE_MASTER)))
         {
             Log.d(this.getClass().getCanonicalName(), "Choosing Release List Item");
             v = LayoutInflater.from(mContext).inflate(R.layout.releaselistitem, null);
         }
         else
         {
             v = LayoutInflater.from(mContext).inflate(R.layout.lplistitem, null);
         }

    }

これらの行の下の残りのコードは同じままにします。試してみてください!

于 2011-03-05T01:36:27.433 に答える
1

...></ ImageView> の代わりに /> で ImageView XML エントリを終了してみてください

そうでない場合は、各属性を 1 つずつ削除してみてください (layout_gravity など)。

幸運を。

于 2011-03-05T01:11:14.253 に答える