2

使用するジレンマがあります

if (convertview==null){
(my code)
}

か否か。このコードがないと、私のリストビューはそれほど高速ではなく、数ミリ秒間ロックされることがあり、使用中にこれに簡単に気付くことができます。それは、その意図したとおりに機能しません。

しかし、このコードが完了すると、しばらくすると(10程度)リストアイテムの再カウントが開始され、リストにいくつかのリストアイテムが返されます(使用したヘッダーが含まれます)。このチュートリアルを使用して、セクションリンク付きのリストビューを取得しました。リストの長さは良いです。

もちろん、私のリストは、アイテムを繰り返すビュー(ちなみにうまくセクション化されています)ではまったく役に立ちませんが、遅くしたくありません。誰かが何をすべきか知っていますか?以下は私のアダプターです:

パブリッククラスDelftAdapterはBaseAdapterを拡張します{

private Activity activity;
private  List<ListItem> listItems;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader; 
private final int[] bgColors = new int[] { R.color.list_odd, R.color.list_even };


public DelftAdapter(Activity a, ArrayList<ListItem> li) {
    activity = a;
    listItems = li;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());

}

public int getCount() {
    return listItems.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}




public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;


        final ListItem li = listItems.get(position); 
        if (li != null) {
            if(li.isSection()){ // is sectionheader
                SectionItem si = (SectionItem)li; 
                vi = inflater.inflate(R.layout.sectionedlistitem, null);
                vi.setOnClickListener(null);
                vi.setOnLongClickListener(null);
                vi.setLongClickable(false);
                final TextView sectionView = (TextView) vi.findViewById(R.id.list_header_title);
                sectionView.setText(si.getTitle());
            }else{ // no sectionheader
                ListData ld = (ListData)li;
            vi = inflater.inflate(R.layout.singlelistitem, null);
        TextView tvNames=(TextView)vi.findViewById(R.id.tvname); 
        TextView tvTip=(TextView)vi.findViewById(R.id.tvtip);
        ImageView image=(ImageView)vi.findViewById(R.id.image);
        tvNames.setText(ld.name);
        tvTip.setText(ld.tip);
            if (listItems.get(position) != null ){
                imageLoader.DisplayImage(ld.photoUrl, image);
                }
                else{
                image.setImageURI(Uri.fromFile(new File("//assets/eten.png")));
            }
        // alternating colors
        int colorPos = position % bgColors.length;
             vi.setBackgroundResource(bgColors[colorPos]);
            }
    }
        return vi;

}
}
4

1 に答える 1

5

getItemViewType()getViewTypeCount()をリサイクルで使用することを検討してくださいconvertView。これらは、さまざまなレイアウトのリストアイテムがある場合に使用されます。あなたは間違いなくリサイクルする必要がありconvertViewます。

http://android.amberfog.com/?p=296も参照してください

あなたの場合:

    private static final int TYPE_ITEM = 0;
    private static final int TYPE_SECTION = 1;

    @Override
    public int getItemViewType(int position) {
        return listItems.get(position).isSection() ? TYPE_SECTION : TYPE_ITEM
    }

    @Override
    public int getViewTypeCount() {
        return 2;  // sectionheader and regular item
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int type = getItemViewType(position);
        if (convertView == null) {
            switch (type) {
                case TYPE_ITEM:
                    convertView = mInflater.inflate(R.layout.singlelistitem, null);
                    ...
                    break;
                case TYPE_SECTION:
                    convertView = mInflater.inflate(R.layout.sectionedlistitem, null);
                    ...
                    break;
            }
        } else {
            ...
        }
        return convertView;
    }

また、ViewHolderパターンを使用して、パフォーマンスを向上させます。

于 2012-07-23T15:06:37.280 に答える