0

リストビュー(別名convertView)でのビューのキャッシュに少し面倒なので、ここに私のコードを示します。

private class CurrencyAdapter extends ArrayAdapter<CurrencyModel> {
    Context ctx;
    int layoutResourceId;
    List<CurrencyModel> adapter_models = null;

    public CurrencyAdapter(Context ctx, int layoutResourceId,
            List<CurrencyModel> model) {
        super(ctx, layoutResourceId, model);
        this.ctx = ctx;
        this.layoutResourceId = layoutResourceId;
        adapter_models = model;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Log.d(Constants.APP_TAG, "position: " + position);
        View row = convertView;
        CurrencyAdapterContainer holder = null;
        if (row == null) {
            Log.d(Constants.APP_TAG, "APP NULL");
            row = ((Activity) ctx).getLayoutInflater().inflate(
                    layoutResourceId, parent, false);
            holder = new CurrencyAdapterContainer();
            holder.textView = (TextView) row
                    .findViewById(R.id.currencies_txt);
            holder.imgView = (ImageView) row
                    .findViewById(R.id.currencies_flag_icon);
            row.setTag(holder);

        } else {
            Log.d(Constants.APP_TAG, "APP NOT NULL");
            holder = (CurrencyAdapterContainer) row.getTag();
        }

        CurrencyModel curr = getItem(position);

        if (curr.currency_value == null) {
            if (counter < MAX_COUNTER) {
                ++counter;
                CurrencyJsonDownloader cDownloader = new CurrencyJsonDownloader(
                        curr, holder.textView);  //download currency value in background, and set textview text if currency_value has been loaded in onpostExcecute (i'm using AsyncTask)
                String url = CURRENCY_URL.replace("<symbol>", curr.symbol);
                Log.d(Constants.APP_TAG, "Url currency: " + url);
                cDownloader.execute(url);
            }
            holder.textView.setText("");
        } else {
            holder.textView.setText(curr.currency_value);
        }
        holder.imgView.setImageResource(curr.drawableId);

        return row;
    }

    @Override
    public CurrencyModel getItem(int position) {
        // TODO Auto-generated method stub
        return adapter_models.get(position);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return adapter_models.size();
    }
}

static class CurrencyAdapterContainer {
    ImageView imgView;
    TextView textView;
}

これが私のlogcatの出力です

位置: 0 APP NULL

位置 : 1 APP NOT NULL

位置 : 2 APP NOT NULL

位置 : 3 APP NOT NULL

. . .

位置 : 10 APP NOT NULL

これは、バックグラウンドジョブで渡されるテキストビューが同じテキストビューであり、変更されたビューが同じテキストビューであり、もちろんスクロールしない限り他のテキストビューには空白のビューがあることを意味するため、災害を引き起こします。そしてすべてが順調です。しかし、常にその値を変更するテキストビューが 1 つだけであるため、アプリの起動時に問題が発生します。

なぜこれが起こるのですか?私ができるハックはありますか?? 前にありがとう...

4

2 に答える 2

0

リストアダプタに問題があると思います。ここに私はアダプタークラスを投稿しました。それはあなたを助けると思います。

public class UploadListAdaptor extends BaseAdapter {
private Context context;
private List<UploadDetailsObj> uploadList;

public UploadListAdaptor(Context context, List<UploadDetailsObj> list) {
    this.context = context;
    uploadList = list;

}

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

public Object getItem(int position) {
    return uploadList.get(position);
}

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

/** LIST CATEGORY */

public View getView(int position, View convertView, ViewGroup viewGroup) {

    final UploadDetailsObj chlListObj = uploadList.get(position);

    if (convertView == null) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater
                .inflate(R.layout.inflator_progress_bar, null);

        TextView photoName = (TextView) convertView
            .findViewById(R.id.tv_photoname);

        Button btnProgress=(Button)convertView.findViewById(R.id.btn_progress);
    photoName.setText(chlListObj.getPhotoName());




    }


    return convertView;

}

   }

このコードを使用して、このアダプターを呼び出すことができます。

 List<UploadDetailsObj> listofUploads= new ArrayList<UploadDetailsObj>();
 UploadListAdaptor uploadListAdptr = new UploadListAdaptor(yourclass.this,
            listofUploads);

    uploadListView.setAdapter(uploadListAdptr);
于 2012-10-27T16:09:29.933 に答える
0

ListView アイテム ビューは再利用されるため、特定のアイテム ビューへの参照を決して保持せず、ListView がスクロールされた後に同じデータを表すことを期待してください。

代わりにデータ項目をワーカー タスクに渡し、データを更新させます。

更新中:

  • 現在のアイテムが画面外にある場合は、アダプターから要求され (ListView がスクロールしたときに)、更新されたデータが表示されます。
  • そのアイテムが現在表示されている場合はnotifyDataSetChanged()、アダプターを呼び出します。これにより、ListView は表示されているアイテムを更新します。
于 2012-10-27T16:36:05.253 に答える