2

を繰り返しArrayAdapter、表示されるオブジェクトの数が正しく、それがログに戻っていますが正しいですが、例えば6オブジェクト表示、残りは私のカスタムのみ、私はグリッドビューのためにそれを使用しているいくつかの項目

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なし==ヌル)状態ではすべてが正しいがスクロールはゆっくりです

+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); 
     } 

1つの項目ごとに2つのループが実行されます。代わりに、そのロジックをモデルに入れたいと思うかもしれません。したがって、アイテムをレンダリングするとき、albumNameとalbumAuthorはすでに設定されています。

+0

最初の投稿で私の最後のコメントを読んでください – Hadi