Я разработкой приложения пленки для отображения различных пленок,ListView не обновляется на экране при добавлении новых элементов
Я делаю вызов к AsyncTask нити и получить возвращающийся вызов:
@Override
public void processFinish(final ArrayList<Film> output) {
generateFilmList(output);
}
Использования данные фильма я генерировать вид списка:
public void generateFilmList(final ArrayList<Film> films) {
ListView lv = (ListView) findViewById(R.id.listView);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position,
long id) {
Intent intent = new Intent(Film_List.this, Film_Details.class);
Bundle b = new Bundle();
b.putParcelable("film", films.get(position));
intent.putExtras(b);
startActivity(intent);
}
});
if (la == null) {
la = new ListAdapter(this, films);
lv.setAdapter(la);
} else {
runOnUiThread(new Thread(new Runnable() {
public void run() {
la.clear();
la.addAll(films);
}
}));
}
la.notifyDataSetChanged();
lv.setSelectionAfterHeaderView();
}
Это мой список адаптер:
public class ListAdapter extends ArrayAdapter<Film> {
private final Context context;
private ArrayList<Film> films;
private View rowView;
public ListAdapter(Context context, ArrayList<Film> films) {
super(context, R.layout.row, films);
this.context = context;
this.films = films;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.row, parent, false);
generateTitle(position);
generateTag(position);
generateImage(position);
return rowView;
}
public void generateTitle(final int position) {
TextView title = (TextView) rowView.findViewById(R.id.text_title);
title.setText(films.get(position).getTitle());
}
public void generateTag(final int position) {
TextView tag = (TextView) rowView.findViewById(R.id.text_description);
tag.setText(films.get(position).getTag());
}
public void generateImage(final int position) {
final ImageView image = (ImageView) rowView.findViewById(R.id.image_poster);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(films.get(position).getImg());
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
image.setImageBitmap(bmp);
} catch (Exception e) {
new Debugger().print(e.toString());
}
}
});
thread.start();
}
}
отобразить только 20 фильмов в виде списка для каждой страницы, поэтому при вызове новой страницы я создать новый запрос с новым значением страницы:
public void nextPage(View view) {
this.page = page + 1;
new Debugger().print(Integer.toString(page));
generateFilmQuery();
}
Это также обновляет мой ListView с новыми значениями ,
Моя проблема в том, что, хотя просмотр списка обновлен, поскольку адаптер списка был изменен. Экран не отображает изменения до тех пор, пока я не прокручу страницу вниз. Это не имеет смысла, поскольку я звоню notifyDataSetChanged
, хотя это ничего не делает!
почему вы инициализировать ListView в ** generateFilmList **, а не в ** OnCreate ** метод ?? –
Выполняет только один экземпляр действия и вызывает метод generateFilmList для обновления списка - тогда как если бы он был в onCreate, мне пришлось бы перезапустить активность –