我无法理解这个nullpointer异常

时间:2012-06-26 23:10:23

标签: android nullpointerexception

我正在学习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中使用listview:

<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填充listview:

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);
            }

好吧,我有一个nullpointerexception,因为dvh.duplicado为null。

eclipse中的debbuging我在行中看到了

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

项目已创建且项目包含在名为mChildren的内部数组中创建的CtlDuplicado,但是当我获得item.findViewById(R.id.dupCancion)时,它返回null ...

R.id.dupCancion在项目的R中定义。

有人能给我任何关于发生了什么的线索吗?

编辑:null的dvh.duplicado是'if'中的那个,这个;

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

R.id.dupCancion存在并且在项目的内部数组中创建了一个名为mChildren的CtlDuplicado但是当我在item中调用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 ...

1 个答案:

答案 0 :(得分:1)

您没有设置实际视图(可能是拼写错误)

item.setTag(item);

应该是

item.setTag(dvh);