2014-12-12 8 views
1

В основном у меня есть база данных sqlite, которая позволяет мне вставлять изображения отелей с названиями. Раньше у меня была проблема, так как я получал повторяющиеся изображения, показанные в списке, но, слава богу, я это исправил. Теперь изображения отображаются в порядке. Однако при прокрутке вниз или вверх по списку приложение сбой.Listview падает при прокрутке вниз или вверх

Вот как я инициализирую пользовательский адаптер.

 adapter = new HotelArrayAdapter(this, R.layout.single_row, 
      imageArry); 
     ListView dataList = (ListView) findViewById(R.id.list); 
     dataList.setAdapter(adapter); 

И вот как я проектирую его, переопределяя метод getView().

 public class HotelArrayAdapter extends ArrayAdapter<Hotels> { 
     Context context; 
     int layoutResourceId; 
     ArrayList<Hotels> data = new ArrayList<Hotels>(); 
     public HotelArrayAdapter(Context context, int layoutResourceId, 
     ArrayList<Hotels> data) { 
     super(context, layoutResourceId, data); 
     // TODO Auto-generated constructor stub 
     this.layoutResourceId=layoutResourceId; 
     this.context = context; 
     this.data = data; 
     } 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     View row = convertView; 

     ImageHolder holder = null; 

     if(row==null){ 
     LayoutInflater inflater =(LayoutInflater)  
     ((Activity)context).getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = inflater.inflate(layoutResourceId, parent,false); 

     holder = new ImageHolder(); 
     holder.txtTitle = (TextView)row.findViewById(R.id.titleView); 
     holder.imgIcon=(ImageView)row.findViewById(R.id.iconView); 
    } 
     Hotels picture = data.get(position); 
     holder.txtTitle.setText(picture._name); 
     //convert byte to bitmap take from contact class 

     byte[] outImage=picture._image; 
     ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage); 
     Bitmap theImage = BitmapFactory.decodeStream(imageStream); 
     holder.imgIcon.setImageBitmap(theImage); 
    return row; 
    } 
    static class ImageHolder 
    { 
     ImageView imgIcon; 
     TextView txtTitle; 
    } 

} 

и, наконец, выход LogCat является 12-12 19: 43: 20,665: Е/MessageQueue-JNI (1183): java.lang.NullPointerException

  12-12 19:43:20.665: E/MessageQueue-JNI(1183): at 
     athens.tourist.guide.HotelArrayAdapter.getView(HotelArrayAdapter.java:44) 

     12-12 19:43:20.665: E/MessageQueue-JNI(1183): at 
     athens.tourist.guide.HotelArrayAdapter.getView(HotelArrayAdapter.java:44) 
     12-12 19:43:20.665: E/MessageQueue-JNI(1183): at 
     android.widget.AbsListView.obtainView(AbsListView.java:2143) 

     12-12 19:43:20.665: E/MessageQueue-JNI(1183): at 
     android.widget.ListView.makeAndAddView(ListView.java:1831) 

     12-12 19:43:20.665: E/MessageQueue-JNI(1183): at 
     android.widget.ListView.fillUp(ListView.java:708) 
+0

Что представляет собой линия 44 HotelArrayAdapter? – Mou

+0

holder.txtTitle.setText (picture._name); вот этот. – Theo

ответ

3

сбой приложения, поскольку convertView является недействительным только один раз. Попытайтесь сохранить объект-держатель в качестве тега convertView и затем получить его. например

ImageHolder holder = null; 

if(row==null){ 
    LayoutInflater inflater =(LayoutInflater)  
    ((Activity)context).getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    row = inflater.inflate(layoutResourceId, parent,false); 

    holder = new ImageHolder(); 
    holder.txtTitle = (TextView)row.findViewById(R.id.titleView); 
    holder.imgIcon=(ImageView)row.findViewById(R.id.iconView); 
    row.setTag(holder); 
} 
holder = (ImageHolder) row.getTag(); 
+0

спасибо, мой друг. он работает .. – Theo

+0

Добро пожаловать – Blackbelt

0

Основной проблемой является когда строка не равна нулю, вы никогда не инициализируете держатель, так что это значение null и запустите NullPointerException.

Попробуйте изменить этот фрагмент кода:

ImageHolder holder = null; 

if(row==null){ 
    LayoutInflater inflater =(LayoutInflater)  
     ((Activity)context).getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    row = inflater.inflate(layoutResourceId, parent,false); 

    holder = new ImageHolder(); 
    holder.txtTitle = (TextView)row.findViewById(R.id.titleView); 
    holder.imgIcon=(ImageView)row.findViewById(R.id.iconView); 
} 

Для этого друга:

ImageHolder holder = null; 

if(row==null){ 
    LayoutInflater inflater =(LayoutInflater)  
     ((Activity)context).getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    row = inflater.inflate(layoutResourceId, parent,false); 

    holder = new ImageHolder(); 
    holder.txtTitle = (TextView)row.findViewById(R.id.titleView); 
    holder.imgIcon=(ImageView)row.findViewById(R.id.iconView); 
    row.setTag(holder); 
} else { 
    holder = (ImageHolder) row.getTag(); 
} 
+0

все равно то же самое :( – Theo

+0

Вы хорошо скопировали этот код? Добавить в конце, если значение row.setTag (держатель), важно – Mou

+0

все нормально, я исправил его сейчас. Спасибо за ваше время :) – Theo

Смежные вопросы