2016-02-15 5 views
0

Я разработкой приложения пленки для отображения различных пленок,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, хотя это ничего не делает!

+0

почему вы инициализировать ListView в ** generateFilmList **, а не в ** OnCreate ** метод ?? –

+0

Выполняет только один экземпляр действия и вызывает метод generateFilmList для обновления списка - тогда как если бы он был в onCreate, мне пришлось бы перезапустить активность –

ответ

0

Надеюсь, это поможет вам.

Добавить метод в ListAdapter

pubilc void addItems(ArrayList<Film> films) 
{ 
    this.films = films; 
} 

И изменить свой код, как этот

runOnUiThread(new Thread(new Runnable() { 
       public void run() { 
        la.addItems(new ArrayList<Film>()); 
        la.notifyDataSetChanged(); 
        la.addItems(films); 
        la.notifyDataSetChanged(); 
       } 
      })); 
+0

, это какой-то код огня, поддерживающий меня, когда пустота закрывалась –