0

ListViewを表示するためにカスタムアダプタを使用していますが、ListViewは非常にぎくしゃくした動作をします

カスタムアダプタのコード

   class ListAdapter extends BaseAdapter
    {
    Context context;
    ArrayList<T> arr ;

    public ListAdapter(Context con,ArrayList<T> arrayList) {
    arr = arrayList;
    context = con;
    }

    @Override
    public int getCount() {
    return arr.size();
    }
    @Override
            public Object getItem(int arg0) {
                return arg0;
            }
    @Override
            public long getItemId(int arg0) {
                return arg0;
            }

@Override
        public View getView(int pos, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if(convertView == null ){
                viewHolder = new ViewHolder();
                convertView = View.inflate( context,R.layout.match_introspection_list_item, null);
                viewHolder.teamFlagOneImageView = (ImageView) convertView.findViewById(R.id.imageView1);
                viewHolder.teamFlagTwoImageView = (ImageView) convertView.findViewById(R.id.imageView3);
                viewHolder.teamOneTextView =(TextView) convertView.findViewById(R.id.textView1);
                viewHolder.teamTwoTextView =(TextView) convertView.findViewById(R.id.textView4);
                viewHolder.dateTextView =(TextView) convertView.findViewById(R.id.textView2);
                viewHolder.placeTextView =(TextView) convertView.findViewById(R.id.textView3);
                viewHolder.descTextView = (TextView) convertView.findViewById(R.id.desc);
                convertView.setTag(viewHolder);
            }else{
                viewHolder =(ViewHolder) convertView.getTag();
            }

            final MatchIntrospectionObjects obj = arr.get(pos);
            viewHolder.teamOneTextView.setText(obj.home_team_abbrev);
            viewHolder.teamTwoTextView.setText(obj.away_team_abbrev);
            viewHolder.descTextView.setText(Html.fromHtml("<b>Description: </b>")+obj.matchdescription);
            if(obj.date.equals("")){}else
                viewHolder.dateTextView.setText(splitDate(obj.date));

            viewHolder.placeTextView.setText(obj.venue);

            imageLoader.displayImage(FLAG_BASE_URL+obj.home_flag, viewHolder.teamFlagOneImageView, options, animateFirstListener);
            imageLoader.displayImage(FLAG_BASE_URL+obj.away_flag, viewHolder.teamFlagTwoImageView, options, animateFirstListener);

            return convertView;
        }
}

これはListAdpaterのmycodeです

Oncreate()メソッドでこのようにListAdapterを設定しています

ListAdapter adapter =new ListAdapter(this,listArray);
            mListView.setAdapter(adapter);

このコードは、ListViewでのぎくしゃくした影響を最小限に抑えるのに役立ちます。

Universal Image Loaderを使用してURLから画像をフェッチしています同じ画像が同じURLから別のセルをフェッチする場合、Universal ImageLoaderは再度フェッチしてagianを取得するか、生涯に1回フェッチしてから、キャッシュから取得します。

4

2 に答える 2

1

recycler@Samが推奨するビデオの要点は、組み込みのを使用するのではなく、スクロールするたびにビューを膨らませることですListViewArraysを使用して処理を高速化しようとしていますRelativeLayoutが、これを行うためのはるかに優れた方法はViewHolder、ビューのを作成して再利用できるようにすることです。はViewHolder静的内部クラスです。次のように定義します。

public static class ViewHolder {
    public TextView currentRatingText;
    public TextView countryName;
    public GradientTextView rating;
    public TextView rank;
    ...

}

次に、カスタムアダプタのコンストラクタで次のようにインフレータを定義します。rowInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

次に、getView()メソッドは次のようになります。

public View getView(int pos, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
    viewHolder = new ViewHolder;
    convertView = rowInflater.inflate(context,R.layout.team_ranking_list_item, null);
    viewHolder.currentRatingText = (TextView) convertView.findViewById(R.id.Rating);
    viewHolder.countryName = (TextView) convertView.findViewById(R.id.TeamNameTextView);
    viewHolder.rating = (GradientTextView) convertView.findViewById(R.id.RatingTextView);
    viewHolder.rank =(TextView) convertView.findViewById(R.id.RankTextView);
    ...
    //Views can hold a tag, which is an object. By setting the viewHolder as the
    //view tag, we can grab it next time so we don't need to re-inflate everything.
    convertView.setTag(viewHolder);
} else {
    viewHolder = (ViewHolder)convertView.getTag();
}
//Here is where you set all of you views' data.
T t = arr.get(pos);
viewHolder.currentRatingText.setText(t.getText());
viewHolder.countryName.setText("UAE");
...
return convertView;

}

ConvertView画面を離れたビューであり、画面下部の新しいビューに再利用できるようになりました。上で示唆したように、画像をキャッシュすることは間違いなく役立ちますが、リストをスムーズにスクロールするにはこれで十分だと思います。

ビデオは引き続き必須です。RomainGuyは上司です。

于 2013-03-25T20:30:09.370 に答える
1
public View getView(int pos, View convertView, ViewGroup parent) { 
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder;
convertView = rowInflater.inflate(context,R.layout.team_ranking_list_item, null);
viewHolder.currentRatingText = (TextView) convertView.findViewById(R.id.Rating);
viewHolder.countryName = (TextView) convertView.findViewById(R.id.TeamNameTextView);
viewHolder.rating = (GradientTextView) convertView.findViewById(R.id.RatingTextView);
viewHolder.rank =(TextView) convertView.findViewById(R.id.RankTextView);
convertView.setTag(viewHolder);
} else 
 {
viewHolder = (ViewHolder)convertView.getTag();
}
//set data here

return convertView;
}


 static class ViewHolder {
 TextView currentRatingText;
 TextView countryName;
 GradientTextView rating;
 TextView rank;
}

スムーズなスクロールとパフォーマンスのためにビューホルダーを使用してください。毎回findviewByIdの代わりに100枚の画像を表示している場合は、ビューがnullで、データを設定したときに表示します。リサイクルバイ。

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

レイジーリストを使用することもできます。https://github.com/thest1/LazyList

多数の画像を表示するには、UniversalImageLoaderを使用できます。(レイジーリストよりもはるかに多くの構成オプションを提供します)

https://github.com/nostra13/Android-Universal-Image-Loader。レイジーリストに基づいています。SDカード、電話メモリ、またはサーバーから画像を表示できます。ダウンロードに失敗した場合は、エラー画像を表示できます。角が丸い画像を表示できます。ディスクまたはメモリにキャッシュできます。画像を圧縮できます。

カスタムアダプターコンストラクターで

   File cacheDir = StorageUtils.getOwnCacheDirectory(a, "your folder");

  // Get singletone instance of ImageLoader
  imageLoader = ImageLoader.getInstance();
  // Create configuration for ImageLoader (all options are optional)
  ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
      // You can pass your own memory cache implementation
     .discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
     .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
     .enableLogging()
     .build();
 // Initialize ImageLoader with created configuration. Do it once.
 imageLoader.init(config);
 options = new DisplayImageOptions.Builder()
 .showStubImage(R.drawable.stub_id)//display stub image
 .cacheInMemory()
 .cacheOnDisc()
 .displayer(new RoundedBitmapDisplayer(20))
 .build();

getview()で

   ImageView image=(ImageView)vi.findViewById(R.id.imageview); 
   imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options
于 2013-03-25T20:46:29.810 に答える