#android #listview #android-asynctask #android-adapter #convertview
#Android #listview #android-asynctask #android-адаптер #convertview
Вопрос:
У меня есть адаптер, а внутри адаптера есть асинхронная задача. Показать значок макета не может загружаться быстро, и когда я прокручиваю значение, оно меняется случайным образом.
Мой адаптер
private class MyAdapter extends ArrayAdapter<MyClass> {
ConvertView holder = null;
public MyAdapter(Context context, int resource, int textViewResourceId, List<MyClass> objects) {
super(context, resource, textViewResourceId, objects);
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return myclassList.size();
}
public MyClass getItem(int position) {
return myclassList.get(position);
}
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final TextView txtTestKode, txtTestName, txtTestStatus;
final RelativeLayout layoutBadge;
final MyClass data = getItem(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.row_test_transaction, null, false);
holder = new ConvertView(convertView);
convertView.setTag(holder);
} else {
holder = (ConvertView) convertView.getTag();
}
txtTestKode = holder.getTxtTestKode();
txtTestName = holder.getTxtTestName();
txtTestStatus = holder.getTxtTestStatus();
new AsyncTask<String, Void, String>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
try {
String url = "my_url";
WebRequestPost req = new WebRequestPost(url);
req.execute();
BufferedReader reader = new BufferedReader(new InputStreamReader(req.getResultStream()));
String result = reader.readLine();
reader.close();
req.closeStream();
return resu<
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (SQLiteConstraintException e) {
e.printStackTrace();
} catch (SQLiteException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String results) {
super.onPostExecute(results);
if (results != null) {
if (Integer.parseInt(results) > 0) {
holder.getLayoutBadge().setVisibility(View.VISIBLE);
}
}
}
}.execute();
return convertView;
}
}
и:
public static class ConvertView {
private View row;
private RelativeLayout layoutBadge;
public ConvertView(View row) {
this.row = row;
}
public RelativeLayout getLayoutBadge() {
if (layoutBadge == null) {
layoutBadge = (RelativeLayout) row.findViewById(R.id.layoutBadge);
}
return layoutBadge;
}
}
Спасибо
Комментарии:
1. проверьте механизм утилизации listview
2. Также любопытно. Что такое
WebRequestPost
??
Ответ №1:
вы не должны выполнять такие задачи в адаптере. происходит то, что данные извлекаются асинхронно и могут быть доступны в любое время позже (изменение данных случайным образом). адаптер продолжает загружать другие данные строк и не ждет завершения каждой задачи rows, потому что вы делаете это асинхронно.
лучше всего предоставлять данные перед созданием адаптера и отправлять данные в виде списка адаптеру в качестве аргумента конструктора.