2016-03-28 19 views
0

ViewHolders'ı nasıl kullanacağımı anladım, ancak şimdi bunu çalıştırırken boş bir işaretçi istisnası alıyorum. Ben itemTitleView biri için metni ayarlamaya çalıştığımda oluşur ve ne eksik olduğumu tam olarak anlamadım. Farklı arka plan renkleri kullanan üç düzenim var ve her birini ArrayList öğesinin belirli öğesinin listViewItemType'ına bağlı olarak kullanmaya çalışıyorum. Bir Google'ım vardı ama benim için hiç de net değil, herhangi bir yardım takdir edilecektir.ArrayAdapter - ViewHolder boş gösterici hatası

PostItemAdapter.java

public class PostItemAdapter extends ArrayAdapter<Item> 
{ 
    private LayoutInflater inflater; 
    private ArrayList<Item> datas; 
    public static final int TYPE_short = 0; 
    public static final int TYPE_med = 1; 
    public static final int TYPE_long = 2; 

    public PostItemAdapter(Context context, int textViewResourceId, ArrayList<Item> objects) 
    { 
     super(context, textViewResourceId, objects); 

     inflater = ((Activity) context).getLayoutInflater(); 
     datas = objects; 
    } 

    //class to hold view object references 
    static class ViewHolder 
    { 
     TextView itemTitleView; 
     TextView itemTitleView1; 
     TextView itemTitleView2; 
     ImageView itemThumbView; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return datas.get(position).viewtype; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder viewHolder; 
     int listViewItemType = getItemViewType(position); 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.postitem, null); 

      viewHolder = new ViewHolder(); 
      viewHolder.itemThumbView = (ImageView) convertView.findViewById(R.id.itemThumb); 

      if (listViewItemType == TYPE_short) { 
       viewHolder.itemTitleView = (TextView) convertView.findViewById(R.id.itemTitleLabel); 
      } else if (listViewItemType == TYPE_med) { 
       viewHolder.itemTitleView1 = (TextView) convertView.findViewById(R.id.itemTitleLabel1); 
      } else if (listViewItemType == TYPE_long) { 
       viewHolder.itemTitleView2 = (TextView) convertView.findViewById(R.id.itemTitleLabel2); 
      } 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     if (datas.get(position).itemThumbUrl == null) 
     { 
      viewHolder.itemThumbView.setImageResource(R.drawable.test); 
     } 

     viewHolder.itemTitleView.setText(datas.get(position).itemTitle); 
     viewHolder.itemTitleView1.setText(datas.get(position).itemTitle); 
     viewHolder.itemTitleView2.setText(datas.get(position).itemTitle); 

     return convertView; 
    } 
} 

cevap

1

Sen TextView başlığı ayarlarken if else ifadeyi eklemeniz gerekir. , listViewItemTypeTYPE_short'a eşit değilse null olacaktır. Eğer se itemTitleView, itemTitleView1 ve itemTitleView2 istiyoruz ve bunlardan yalnızca biri başlatmak çünkü

if (listViewItemType == TYPE_short) { 
    viewHolder.itemTitleView.setText(datas.get(position).itemTitle);  
} else if (listViewItemType == TYPE_med) { 
    viewHolder.itemTitleView1.setText(datas.get(position).itemTitle);  
} else if (listViewItemType == TYPE_long) { 
    viewHolder.itemTitleView2.setText(datas.get(position).itemTitle);  
} 
1

Sizin NullPointer exception gelir. Değişkenleri başlattığınızda, ancak verileri textViews olarak ayarladıysanız, aynı statüye sahip olmanız gerekir.

if (listViewItemType == TYPE_short) { 
    viewHolder.itemTitleView.setText(datas.get(position).itemTitle);  
} 

vb ...

İlgili konular