0

カスタム ListView アダプターに問題があります。ViewHolder を使用したいのですが (リストビューには 100 個以上の要素があるため)、コードを使用するとリストビューがループします。ループとは、最初の位置のみを表示し、リストビューの最後までその外観をループすることを意味します。私はこのサイトから提案していました:クリックしてください。

これは私のコードです:

public class ListList extends ArrayAdapter<String>{
private final String[] web;
private final Integer[] imageId;
Context context;
public ListList(Context context,
String[] web, Integer[] imageId) {
super(context, R.layout.champion_list, web);
this.context = context;
this.web = web;
this.imageId = imageId;
}
@Override
public View getView(int position, View v, ViewGroup parent) {

    ViewHolder holder = new ViewHolder();
    if(v == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        v = inflater.inflate(R.layout.champion_list, null);

        holder.txt = (TextView)v.findViewById(R.id.txt);
        holder.img = (ImageView)v.findViewById(R.id.img);
        holder.txt.setText(web[position]);
        holder.img.setImageResource(imageId[position]);
        v.setTag(holder);
    }

    else {
        // View recycled !
        // no need to inflate
        // no need to findViews by id
        holder = (ViewHolder) v.getTag();
    }

    return v;
}

static class ViewHolder {
    TextView txt;
    ImageView img;
}
}

私が間違っていたアイデアはありますか?if ステートメントから .setText と .setImageResource を入れてみましたが、うまくいきましたが、このサイトによると、私は間違っています... また、リストビューを「ラグフリー」にするためのヒントを教えてください。

4

1 に答える 1

0

これを試して :

ViewHolder holder = new ViewHolder();
if(v == null) {
    LayoutInflater inflater = LayoutInflater.from(context);
    v = inflater.inflate(R.layout.champion_list, null);

    holder.txt = (TextView)v.findViewById(R.id.txt);
    holder.img = (ImageView)v.findViewById(R.id.img);
    v.setTag(holder);
}

else {
    holder = (ViewHolder) v.getTag();
}

//move here
holder.txt.setText(web[position]);
holder.img.setImageResource(imageId[position]);

アダプターが最初のアイテムをロードするときにのみテキストと画像を設定するため (次のアイテムはホルダーを再利用します)

于 2014-11-11T08:04:05.013 に答える