0

私はAndroidを学んでいて、カスタムコントロールを実行しました。レイアウトに入れると問題なく動作します。私はそれをitemduplicados.xmlにこのように置きました:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <com.android.customViews.CtlDuplicado
        android:id="@+id/dupCancion"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

次に、このコントロールの多くのリストを作成したいので、listadoduplicado.xmlのリストビューを使用します。

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

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LstListadoDuplicados"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</ListView>
</LinearLayout>

onCreateを使用したこのためのアクティビティ:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listadoduplicados);
        AdaptDuplicados adapter = new AdaptDuplicados(this, Deduplicator.deduplicate());
        final ListView lstDuplicados = (ListView) findViewById(R.id.LstListadoDuplicados);
        lstDuplicados.setAdapter(adapter);
        lstDuplicados.setVisibility(View.VISIBLE);

    }

次に、arrayadapterを拡張してリストビューにctlduplicadosを設定するクラス:

public AdaptDuplicados(Activity context, ArrayList<Duplicado> datos) {
    super(context, R.layout.itemduplicado, datos);
        this.context = context;
        this.datos = datos;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
                View item = convertView;
                DuplicadoViewHolder dvh;
                if (item == null){
                    LayoutInflater li = context.getLayoutInflater();
                    item = li.inflate(R.layout.itemduplicado, null);
                    dvh = new DuplicadoViewHolder();
                    dvh.duplicado = (CtlDuplicado)item.findViewById(R.id.dupCancion);
                    item.setTag(item);
                }else{
                    dvh = (DuplicadoViewHolder)item.getTag();
                }
                dvh.duplicado.setCanciones(datos.get(position));//here is the nullpointerexception cause duplicado is null
                return (item);
            }

dvh.duplicadoがnullであるため、nullpointerexceptionがあります。

Eclipseでのデバギング私はそれを行に見ます

item = li.inflate(R.layout.itemduplicado, null); 

アイテムが作成され、アイテムにはmChildrenという内部配列で適切に作成されたCtlDuplicadoが含まれていますが、item.findViewById(R.id.dupCancion)を取得すると、nullが返されます...

R.id.dupCancionは、プロジェクトのRで定義されています。

誰かが私に何が起こっているのかについての手がかりを与えることができますか?

編集:nullであるdvh.duplicadoは、「if」の1つです。

 dvh.duplicado = (CtlDuplicado)item.findViewById(R.id.dupCancion);

R.id.dupCancionが存在し、mChildrenというアイテムの内部配列にCtlDuplicadoが作成されていますが、アイテムでfindViewByIdを呼び出すと、nullが返されます...

実現:

カスタムコントロール内のコントロールにアクセスしようとしましたが、次の方法でアクセスできます。

lbltxt1 = (TextView)item.findViewById(R.id.lbltxt1);
lbltxt2 = (TextView)item.findViewById(R.id.lbltxt2);
lblSubtxt1 = (TextView)item.findViewById(R.id.lblSubtxt1);

'if'からのアイテムで...

したがって、コントロールのコンポーネントには到達できますが、コントロール自体には到達できません...

CtlDuplicadoは作成され(デバッガーを介してコンストラクターに到達しました)、正しく描画されますが、findViewByIdを介してアクセスできません...しかし、その関数を介してコンポーネントにアクセスできます... Ufff ...

4

1 に答える 1

1

実際のビューを設定していません(おそらくタイプミス)

item.setTag(item);

する必要があります

item.setTag(dvh);
于 2012-06-27T01:33:47.710 に答える