Android适配器getView null

时间:2016-02-12 16:14:41

标签: android

当它开始运行时,前5行和跟随3行没有错误。但是它会给出空指针异常。我无法解决为什么会这样?

代码段:

public View getView(int position, View convertView, ViewGroup viewGroup) {
    PaylasilanHolder holder;
    final int pozisyon = position;
    Object currentpaylasilan = getItem(position);
    Paylasilanlar paylasilan = (Paylasilanlar) currentpaylasilan;
    if (convertView == null) {
        Log.i("tago", "convertview null");
        holder = new PaylasilanHolder();
        if (paylasilan.cesit.equals("text")) {

            convertView = lala.inflate(R.layout.paylasilanyazi,null);
            holder.tv1 = (TextView) convertView.findViewById(R.id.textView11);
            holder.tv2 = (TextView) convertView.findViewById(R.id.textView12);
            holder.tv3 = (TextView) convertView.findViewById(R.id.textView13);
            holder.image1 = (ImageButton) convertView.findViewById(R.id.imageButton11);
            Log.i("tago", "texttexttext");
        } else if (paylasilan.cesit.equals("teklifoto")) {

            convertView = lala.inflate(R.layout.paylasilanresim,null);
            holder.tv1 = (TextView) convertView.findViewById(R.id.textView11);
            holder.tv2 = (TextView) convertView.findViewById(R.id.textView12);
            holder.tv3 = (TextView) convertView.findViewById(R.id.textView13);
            holder.image1 = (ImageButton) convertView.findViewById(R.id.imageButton11);
            Log.i("tago", "tekliteklitekli");
        } else if (paylasilan.cesit.equals("ikilifoto")) {
            Log.i("tago", "ikiliikiliikili");
        } else if (paylasilan.cesit.equals("anket")) {

            convertView = lala.inflate(R.layout.paylasilananket, null);
            holder.etv1 = (EditText) convertView.findViewById(R.id.editText5);
            holder.etv2 = (EditText) convertView.findViewById(R.id.editText6);
            holder.etv3 = (EditText) convertView.findViewById(R.id.editText7);
            holder.etv4 = (EditText) convertView.findViewById(R.id.editText8);
            Log.i("tago", "anketanketanket");
        }

        convertView.setTag(holder);

    } else {
        holder = (PaylasilanHolder) convertView.getTag();
    }

    if (paylasilan.cesit.equals("text")) {
        holder.tv1.setText(paylasilanlarListesi.get(position).getGonderenid());
        holder.tv2.setText(paylasilanlarListesi.get(position).getYaziveyaurl());
    } else if (paylasilan.cesit.equals("teklifoto")) {
        holder.tv3.setText(paylasilanlarListesi.get(position).getGonderenid());
        new urldenResim(holder.image1).execute(paylasilanlarListesi.get(position).getYaziveyaurl());
    } else if (paylasilan.cesit.equals("ikilifoto")) {

    } else if (paylasilan.cesit.equals("anket")) {
        holder.etv1.setText(paylasilanlarListesi.get(position).getQuestion());
        holder.etv2.setText(paylasilanlarListesi.get(position).getOption1());
        holder.etv3.setText(paylasilanlarListesi.get(position).getOption2());
        holder.etv4.setText(paylasilanlarListesi.get(position).getOption3());
    }
    return convertView;
}

它给出了:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference    

 com.example.bahadir.myapplicationn.PaylasilanlarAdapter.getView(PaylasilanlarAdapter.java:128)

在holder.tv3.settext()方法中。

我怎样才能克服它?

3 个答案:

答案 0 :(得分:2)

你不能混合不同的观点。因为,例如,如果您有前10个项目paylasilan.cesit.equals("anj=ket"),之后有一些其他项目,则适配器视图已经使用R.layout.paylasilananket初始化,并且确保holder.tv3.setText会为您提供NullPointerException < / p>

您应该将所有布局混合到一个布局中,并根据非常糟糕的项目显示/隐藏部件,或者使用本教程中的viewTypes:http://www.survivingwithandroid.com/2014/08/android-listview-with-multiple-row.html

答案 1 :(得分:1)

由于您只使用了一种视图,我认为您还在处理器中处理了一种视图。因此,您要创建一种类型的视图,并将其重新用于另一种类型。

您必须覆盖getViewTypeCount()getItemViewType(int position)才能返回正确的值以使您的模型发挥作用。

答案 2 :(得分:1)

你不能像现在这样做。当您尝试重用不同类型的单元格并且您尝试获取对不存在的文本字段的引用时,会出现崩溃。

您必须向“PaylasilanHolder”添加另一个字段,并在您为新单元格充气时将其设置为单元格类型。

当您重复使用单元格时,即:当“convertView!= null”时,您还必须通过引用您在“PaylasilanHolder”中定义的新字段来检查单元格类型是否相同。否则,再次给细胞充气。