0

AsynTask から TextView を更新する際に奇妙な問題が発生しています。アダプターの getView 関数で、数値を計算して画面に表示するために AsyncTask を起動します。

問題は、 getView 関数が単一のアイテムに対して数回呼び出されるため、表示したい数値を数回計算することです。これはあまり効率的ではありません。

調査の結果、AsyncTask への os 呼び出しの数を制限しようとすると、その数が画面に表示されないことがわかりました (エラー メッセージや例外はありません)。

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.category_item, null);
    TextView tvCategory = (TextView) rowView.findViewById(R.id.tvCategory);
    TextView tvUnreadNews = (TextView) rowView.findViewById(R.id.tvUnreadNews);

    Category cat = mCategoriesList.get(position);
    tvCategory.setText(cat.getName());
    if(!cat.isInitialized()) //<-- If I delete this line it works, but inefficienly, as the AsyncTask is launched many times repeatedly
    {
            cat.setIsInitialized(true)
        new GetNewsForCategoryTask(cat, tvUnreadNews, mContext).execute(cat.getId());
    }
    return rowView;
}

これが AsyncTask です。が繰り返し呼び出された場合は TextView を適切に更新しますが、カテゴリに対して 1 回だけ呼び出された場合は値を更新しません。

public class GetNewsForCategoryTask extends AsyncTask<String, Integer, JSONArray>{

private Context mContext;
private String mCategoryId;
private TextView mTvUnread;
private Category mCategory;

public GetNewsForCategoryTask(Category cat, TextView tvUnread, Context context) {
    mTvUnread = tvUnread;
    mCategory = cat;
    mContext = context;
}

@Override
protected JSONArray doInBackground(String... params) {
    mCategoryId = params[0];

     ...

}

@Override
protected void onProgressUpdate(Integer... values) {
    mTvUnread.setText(Integer.toString(values[0]));
}

@Override
protected void onPostExecute(JSONArray result) {
    if(result != null && mThrown == null)
    {
        publishProgress(mCategory.getUnreadNewsSet().size());
    }
}

}

この奇妙な動作の理由は何ですか? AsyncTask を pro カテゴリで 1 回だけ起動したときに適切に呼び出されることを確認しましたが、レイアウトを更新しないでください。何回かプロカテゴリーを立ち上げると効果があるのはなぜですか?

更新: 私はテストを行ってきましたが、問題は getView() 関数にあるようです。変数が初期化されているかどうかを確認すると、ListView の最初の要素のみが変更されます... ListView の他の項目のすべての値が変更されます!!

したがって、TextView が値を設定しようとしているように見えますが、常に最初の値 (ListView の最初の要素) です。

何か案が???

4

1 に答える 1

0

これを見てください:

Category cat = mCategoriesList.get(position);
tvCategory.setText(cat.getName());
if(!cat.isInitialized()) //<-- If I delete this line it works, but inefficienly, as the AsyncTask is launched many times repeatedly
{
    cat.setIsInitialized(true)
    new GetNewsForCategoryTask(cat, tvUnreadNews, mContext).execute(cat.getId());
}

が再度呼び出されると、常に初期化されていないものを返すため、setIsInitialized(true)onではmCategoriesList.get(position)なく onを呼び出す必要があると思います。catgetView()mCategoriesList.get(position)setIsInitialized(true)catmCategoriesList

于 2013-10-30T13:01:41.883 に答える