2

Я использую его для просмотра сетки, количество объекта отображается правильно, и это возвращение в журнале является правильным, но, например, 6 экранным объектом, а остальные повторяют ихМоего заказа ArrayAdapter повторяет только несколько пунктов

1 , 2,3,4,5,6, 1,2,3,4,5,6, .....

мой код

public class CustomAdapter extends ArrayAdapter<ItemObject> { 

    private static float textViewWidth; 

    public CustomAdapter(ArrayList<ItemObject> array, float textViewWidth) { 
     super(G.context, R.layout.sample_album_item, array); 
     CustomAdapter.textViewWidth = textViewWidth; 
    } 

    private static class ViewHolder { 

     ImageView imgScreenShot; 
     TextView txtAlbumName; 
     TextView txtAlbumAuthor; 


     public ViewHolder(View view) { 
      imgScreenShot = (ImageView) view.findViewById(R.id.screen_shot); 
      txtAlbumName = (TextView) view.findViewById(R.id.album_name); 
      txtAlbumAuthor = (TextView) view.findViewById(R.id.album_author); 
     } 


     public void fill(final ArrayAdapter<ItemObject> adapter, final ItemObject item, final int position) { 
      imgScreenShot.setImageResource(item.getScreenShot()); 

      String albumName = item.getAlbumName(); 
      String albumAuthor = item.getAlbumAuthor(); 

      float musicNameWidthSizeViaParent = widthSizeViaParent(txtAlbumName, albumName); 
      float musicAuthorWidthSizeViaParent = widthSizeViaParent(txtAlbumAuthor, albumAuthor); 

      if (musicNameWidthSizeViaParent < 0) { 
       for (int i = 1; i < albumName.length() - 1; i++) { 
        if (widthSizeViaParent(txtAlbumName, albumName.substring(0, i).trim() + "...") < 0) { 
         albumName = albumName.substring(0, i - 1).trim() + "..."; 
         break; 
        } 
       } 
      } 

      if (musicAuthorWidthSizeViaParent < 0) { 
       for (int i = 1; i < albumAuthor.length() - 1; i++) { 
        if (widthSizeViaParent(txtAlbumName, albumAuthor.substring(0, i).trim() + "...") < 0) { 
         albumAuthor = albumAuthor.substring(0, i - 1).trim() + "..."; 
         break; 
        } 
       } 
      } 

      txtAlbumName.setText(albumName); 
      txtAlbumAuthor.setText(albumAuthor); 
     } 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     ItemObject item = getItem(position); 
     if (convertView == null) { 
      convertView = G.inflater.inflate(R.layout.sample_album_item, parent, false); 
      holder = new ViewHolder(convertView); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.fill(this, item, position); 
     return convertView; 
    } 

    private static float widthSizeViaParent(TextView text, String newText) { 
     float textWidth = text.getPaint().measureText(newText); 
     return textViewWidth - (textWidth * G.displayMetrics.density); 
    } 

} 

если метод GetView без этого (convertView == null) состояние, все правильно, но прокрутка медленно

+0

Так медленная прокрутка - проблема, с которой вы сталкиваетесь? –

+0

Используйте BaseAdapter, если вы планируете его продлить. – Nanoc

+0

В этом случае я искал и понимал, что для более плавной прокрутки требуется это условие (convertView == null). Я не знаю, что делать с повторением – Hadi

ответ

0

Я предполагаю, что этот блок кода заставляет его работать медленно:

public void fill(final ArrayAdapter<ItemObject> adapter, final ItemObject item, final int position) { 
      imgScreenShot.setImageResource(item.getScreenShot()); 

      String albumName = item.getAlbumName(); 
      String albumAuthor = item.getAlbumAuthor(); 

      float musicNameWidthSizeViaParent = widthSizeViaParent(txtAlbumName, albumName); 
      float musicAuthorWidthSizeViaParent = widthSizeViaParent(txtAlbumAuthor, albumAuthor); 

      if (musicNameWidthSizeViaParent < 0) { 
       for (int i = 1; i < albumName.length() - 1; i++) { 
        if (widthSizeViaParent(txtAlbumName, albumName.substring(0, i).trim() + "...") < 0) { 
         albumName = albumName.substring(0, i - 1).trim() + "..."; 
         break; 
        } 
       } 
      } 

      if (musicAuthorWidthSizeViaParent < 0) { 
       for (int i = 1; i < albumAuthor.length() - 1; i++) { 
        if (widthSizeViaParent(txtAlbumName, albumAuthor.substring(0, i).trim() + "...") < 0) { 
         albumAuthor = albumAuthor.substring(0, i - 1).trim() + "..."; 
         break; 
        } 
       } 
      } 

      txtAlbumName.setText(albumName); 
      txtAlbumAuthor.setText(albumAuthor); 
     } 

Две петли для каждого элемента. Вероятно, вы захотите иметь эту логику в моделях. Таким образом, при рендеринге элементов, albumName и albumAuthor уже установлены.

+0

, пожалуйста, прочитайте мой последний комментарий в первом посте – Hadi

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