2012-05-21 4 views
1

У меня есть расширенный базовый адаптер --- у меня возникла какая-то странная проблема ... когда я просматриваю этот список - мои последние элементы заменяются первым элементом и в следующий раз, когда я просматриваю - другой элемент и все .. когда-нибудь это правильно .. почему это происходит с этим кодом?ListView Jumbled on scroll

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // sets the view onto list view 
     LinearLayout rowLayout = null; 

     System.out.println("getView " + position + " " + convertView); 
     rowLayout = (LinearLayout) mInflater.inflate(
       R.layout.apps_list_row_items, parent, false); 
     if (convertView == null) { 
      // inflating the row 

      vh.mAppIcon = (ImageView) rowLayout.findViewById(R.id.icon); 
      vh.mAppName = (TextView) rowLayout.findViewById(R.id.application); 

      vh.mAppHint = (TextView) rowLayout.findViewById(R.id.hint); 

      mDownloadButton = (Button) rowLayout.findViewById(R.id.download); 
      mDownloadButton.setFocusable(false); 

     } else { 
      // convertView.getTag(); 
      rowLayout = (LinearLayout) convertView; 
     } 
     // convertView.getTag(); 

     // On Click of the download button which triggers an async to download 
     // the file. 


     mIcon = mAppIconMapList.get(position); 
     System.out.println("Icon " + mIcon); 
     mCurrentApplication = mAvaiableApps.get(position); 
     System.out.println("Current App " + mCurrentApplication); 
     vh.mAppIcon.setImageBitmap(mIcon.get(mCurrentApplication)); 
     vh.mAppName.setText(mCurrentApplication.replace(".apk", "")); 
     vh.mAppHint.setText("Click here to view Description"); 

     return rowLayout; 
    } 

ответ

0

Ваш GetView метод выглядит немного подозрительным, попробуйте изменить его, как показано ниже:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
     // sets the view onto list view 

     ViewHolder vh = null; 


     System.out.println("getView " + position); 

     if (convertView == null) { 
      // inflating the row 
      LinearLayout rowLayout = (LinearLayout) mInflater.inflate(
       R.layout.apps_list_row_items, parent, false); 

      vh.mAppIcon = (ImageView) rowLayout.findViewById(R.id.icon); 
      vh.mAppName = (TextView) rowLayout.findViewById(R.id.application); 

      vh.mAppHint = (TextView) rowLayout.findViewById(R.id.hint); 

      mDownloadButton = (Button) rowLayout.findViewById(R.id.download); 
      mDownloadButton.setFocusable(false); 

      convertView.setTag(vh); 

     } else { 
      vh = (ViewHolder) convertView.getTag(); 
     } 


     // On Click of the download button which triggers an async to download 
     // the file. 


     mIcon = mAppIconMapList.get(position); 
     System.out.println("Icon " + mIcon); 
     mCurrentApplication = mAvaiableApps.get(position); 
     System.out.println("Current App " + mCurrentApplication); 
     vh.mAppIcon.setImageBitmap(mIcon.get(mCurrentApplication)); 
     vh.mAppName.setText(mCurrentApplication.replace(".apk", "")); 
     vh.mAppHint.setText("Click here to view Description"); 

     return convertView; 
} 
+0

И 'vh' должен быть объявлен как локальная переменная - сейчас он является членом данных адаптера или действия. И вам нужно создать новый 'ViewHolder', когда вы надуваете новую строку, вызывая' setTag() '. – CommonsWare

+0

yeas, точно ... спасибо за указание – waqaslam

+0

Я добавил vh = new ViewHolder() в getView, и я сделал convertView.setTag (vh) и getTag еще часть ... но он принудительно закрыт .. –

2

Проблема заключается в том, что listadapter повторное использование строк иногда. Если вы хотите исправить это, удалите следующее:

if (convertView == null) { <----remove 
    //code 
}       <----remove 
else{      <----remove 
    ...      <----remove 
}       <----remove 
+0

phew! теперь я знаю, что это за код: D – Anup