3

Listview に表示するネストされた配列があります。ListView の各行には、Horizo​​ntalScrollView への水平 LinerLayout があります。

現在、私は ViewHolder パターンを使用しており、ListView の getView メソッドで LinerLayout にビューを動的に追加しています。

問題は、スクロールするとリストビューが遅れることです..

これは私のカスタム アダプター クラスです。

public class ChannelArrayAdapter extends ArrayAdapter<Kanal> {
Context context;
List<Kanal> list;
List<Program> pList;
LayoutInflater inflator;

public ChannelArrayAdapter(Context context, List<Kanal> lis) {
    super(context, R.layout.channels, lis);
    // TODO Auto-generated constructor stub
    this.list = lis;
    this.context = context;
}

static class ViewHolder {
    ImageView imageView;
    LinearLayout l;
}

static class ProgramHolder {
    TextView programAdi;
    TextView programSaati;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
     ViewHolder viewHolder = null;
    if (convertView == null) {
        inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflator.inflate(R.layout.channels, parent, false);
        viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageView1);
        viewHolder.l = (LinearLayout) convertView.findViewById(R.id.yayinAkisiLayout);
        convertView.setTag(viewHolder);

    } else {
        viewHolder = (ViewHolder)convertView.getTag();
        viewHolder.l.removeAllViews();
    }

    final Kanal kanal = list.get(position);
    pList = kanal.getKanalProgramListesi();
    viewHolder.imageView.setImageResource(kanal.getResourcesIkonKanal());

    for (Program p : pList) {
        View v = new View(context);
        v.setId(position);
        ProgramHolder pHolder = new ProgramHolder();
        v = inflator.inflate(R.layout.programs, null);          
        pHolder.programSaati = (TextView) v.findViewById(R.id.psaati);
        pHolder.programAdi = (TextView)v.findViewById(R.id.pname);
        pHolder.programAdi.setText(p.getProgramAdi());
        pHolder.programSaati.setText(p.getProgramBaslangic());
        v.setTag(pHolder);
        viewHolder.l.addView(v);
    }

    return convertView;
}

}
4

2 に答える 2

0

ホルダーを静的クラスにし、getView でそのフィールドを編集するだけです。getView が呼び出されるたびにいくつかの新しいオブジェクトを作成しているため、リストビューが遅れます->新しいアイテムがロードされるか、ListView で可視性を得るたびに。

http://www.youtube.com/watch?v=wDBM6wVEO70

これは、効果的なアダプター/リストビューを作成する方法を詳細に説明しています。

于 2013-11-08T13:21:05.657 に答える
0

このコードを最適化できます:

ProgramHolder pHolder = new ProgramHolder();
        v = inflator.inflate(R.layout.programs, null);          
        pHolder.programSaati = (TextView) v.findViewById(R.id.psaati);
        pHolder.programAdi = (TextView)v.findViewById(R.id.pname);
        pHolder.programAdi.setText(p.getProgramAdi());
        pHolder.programSaati.setText(p.getProgramBaslangic());
        v.setTag(pHolder);
        viewHolder.l.addView(v);

パターンとしてView Holder、おそらく静的変数にもこれらのレイアウトを保存する必要があります:

static  ProgramHolder pHolder;

if (pHolder == null) {
    View v = new View(context);
    v = inflator.inflate(R.layout.programs, null);          
    pHolder.programSaati = (TextView) v.findViewById(R.id.psaati);
    pHolder.programAdi = (TextView)v.findViewById(R.id.pname);
}

ここでの主な目的は、使用回数の減少findViewById()です。その後、ループでカスタムビューを作成し、各フィールドに基づいて割り当てることができますpHolder

この助けを願っています:)

于 2013-11-08T14:31:26.703 に答える