我正在学习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 ...
答案 0 :(得分:1)
您没有设置实际视图(可能是拼写错误)
item.setTag(item);
应该是
item.setTag(dvh);