2017-01-31 2 views
0

Hallo Ich realisiere, dass es mehrere Leute mit einem ähnlichen Problem gibt, aber der Grund für das Hinzufügen dieser als eine neue Frage ist, weil dies ein Adapter mit zwei ist Inhaber. Ich habe eine listview, die eine Header-Zelle und die Informationszelle hat. der Fehler, dass ich seine bin Begegnung mit
java.lang.NullPointerException: Versuch, aus Feld zu lesen 'android.widget.TextView

java.lang.NullPointerException: Der Versuch, aus dem Feld ‚android.widget.TextView zu lesen.

Das passiert nur, wenn ich die Liste nach unten scrolle und dann zurück gehe. Ich nehme an, dass die holder zerstört wird und wenn ich die Linie nenne, um Text hinzuzufügen, ist der Inhaber null, aber ich bin nicht sicher. Danke im Voraus für Ihre Hilfe!

Individuelle Adapter:

private class MyCustomAdapter extends ArrayAdapter<sources> { 

    private ArrayList<sources> sources_list = new ArrayList<sources>(); 
    private TreeSet<Integer> sectionHeader = new TreeSet<Integer>(); 
    private static final int TYPE_ITEM = 0; 
    private static final int TYPE_SEPARATOR = 1; 
    private LayoutInflater vi; 

    public MyCustomAdapter(Context context, int textViewResourceId, ArrayList<sources> sources_list) { 
     super(context, textViewResourceId, sources_list); 
     vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void addItem(final sources item) { 
     sources_list.add(item); 
     notifyDataSetChanged(); 
    } 

    public void addSectionHeaderItem(final sources item) { 
     sources_list.add(item); 
     sectionHeader.add(sources_list.size() - 1); 
     notifyDataSetChanged(); 
    } 

    public int getItemViewType(int position) { 
     return sectionHeader.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; 
    } 

    public int getCount() { 
     return sources_list.size(); 
    } 

    public int getViewTypeCount() { 
     return 2; 
    } 

    public sources getItem(int position) { 
     return sources_list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public class ViewHolder { 
     TextView code; 
     CheckBox name; 
    } 

    public class ViewHolder2 { 
     TextView separator; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     ViewHolder2 holder2 = null; 
     Log.v("ConvertView", String.valueOf(position)); 
     int rowType = getItemViewType(position); 
     if (convertView == null) { 
      switch (rowType) { 
       case TYPE_ITEM: 
        convertView = vi.inflate(R.layout.source_cell, null); 
        holder = new ViewHolder(); 
        holder.code = (TextView) 
          convertView.findViewById(R.id.code); 
        holder.name = (CheckBox) 
          convertView.findViewById(R.id.checkBox1); 
        break; 

       case TYPE_SEPARATOR: 
        holder2 = new ViewHolder2(); 
        convertView = vi.inflate(R.layout.source_header, null); 
        holder2.separator = (TextView) 
          convertView.findViewById(R.id.separator); 
        break; 
      } 

      convertView.setTag(holder); 

     } else { 
      if (rowType == TYPE_ITEM) { 
       holder = (ViewHolder) 
         convertView.getTag(R.layout.source_cell); 
      } else { 
       holder2 = (ViewHolder2) convertView.getTag(R.layout.source_header); 
      } 

     } 

     if (rowType == TYPE_ITEM) { 
      sources n_source = sources_list.get(position); 
      holder.code.setText(n_source.getCode().toUpperCase()); 
      holder.name.setTag(n_source); 
     } else { 
      sources n_source = sources_list.get(position); 
      holder2.separator.setText(n_source.getCode().toUpperCase()); 
     } 
     return convertView; 
    } 
} 

Antwort

2

Ihre setTag/getTag scheint falsch zu sein. Sie müssen setTag(r.layout.blah, holder) verwenden, um Ihre getTag(r.layout.blah) zu entsprechen.

+0

Vielen Dank für Ihre Antwort. Basierend auf meinem Code, wo würdest du diese Korrekturen empfehlen? – paul590

+1

@ paul590 entfernen Sie convertView.setTag (Halter) von nach Ihrem Schalter und verwenden Sie convertView.setTag (R.layout.source_cell, Halter) und convertView.setTag (R.layout.source_header, holder2) in den beiden Fallstatements – SteelBytes

+0

Sie sind die Mann! Ich habe mehr in meinen Code geschaut, mein Problem war die Funktion getTag(), ich bekam ein Tag, aber ich machte es wie dieses getTag (R.layout.blah) und war mit dem Code beschäftigt, ich nahm es einfach wieder heraus und es hat funktioniert. Danke noch einmal!! – paul590

Verwandte Themen