2015-06-22 5 views
-2

Я видел много сообщений об этом случае, но я не нашел для меня решения. Я использую SwipeRefreshLayout.OnRefreshListener, и это мой код в методе onRefresh(). Это не работает.adapter.notifyDataSetChanged() не работает, когда я обновляю ArrayList

new Handler().postDelayed(new Runnable() { 
     @Override public void run() { 

      Aviso aviso = new Aviso(); 
      aviso.setTitle("MMMMMMMMMMMMMMMMMMMMMM"); 
      aviso.setDescription("Deskribapena"); 
      aviso.setPubDate("Wed, 19 Mar 2016 12:40:00 GMT"); 
      aviso.setDcDate("2016-03-19T12:40:00Z"); 

      avisosList.add(aviso); 

      swipeRefresh.setRefreshing(false); 
      adapter.notifyDataSetChanged(); 
     } 
     }, 2000); 

Но если я создаю новый адаптер и установить в ListView результат хороший

new Handler().postDelayed(new Runnable() { 
     @Override public void run() { 

      Aviso aviso = new Aviso(); 
      aviso.setTitle("MMMMMMMMMMMMMMMMMMMMMM"); 
      aviso.setDescription("Deskribapena"); 
      aviso.setPubDate("Wed, 19 Mar 2016 12:40:00 GMT"); 
      aviso.setDcDate("2016-03-19T12:40:00Z"); 

      avisosList.add(aviso); 


        adapter = new AvisosEnListaAdapter(getActivity(), avisosList); 
        lv.setAdapter(adapter); 

       swipeRefresh.setRefreshing(false); 
     } 
     }, 2000); 

код адаптера:

public class AvisosEnListaAdapter extends BaseAdapter{ 

    protected Activity activity; 
    protected ArrayList<Aviso> items; 

    //Constructor 
    public AvisosEnListaAdapter (Activity activity, ArrayList<Aviso> items){ 
     this.activity = activity; 
     this.items = items; 
    } 

    public AvisosEnListaAdapter(ArrayList<Aviso> items) { 
     this.items = items;  // TODO Auto-generated constructor stub 
    } 



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

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

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return items.get(position).get_Id(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     View v = convertView; 

     if(convertView == null){ 
      LayoutInflater inf = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inf.inflate(R.layout.custom_avisosenlista, null); 
     } 

     //Create Aviso object 
     Aviso aviso = items.get(position); 

     //write title 
     TextView title = (TextView) v.findViewById(R.id.custom_avisosenlista_tv_title_aviso); 

     //Fuente 
       Typeface fontTitulo = Typeface.createFromAsset(activity.getAssets(), "fonts/OpenSans-Regular.ttf"); 

       //Setter fuente 
       title.setTypeface(fontTitulo); 
     title.setText(aviso.getTitle()); 

     //write data 
     TextView tvData = (TextView) v.findViewById(R.id.custom_avisosenlista_tv_data_aviso); 
     Typeface fontData = Typeface.createFromAsset(activity.getAssets(), "fonts/OpenSans-LightItalic.ttf"); 

       //Setter fuente 
       tvData.setTypeface(fontData); 
      tvData.setText(aviso.getFechaParaPublicar()); 

     return v; 
    } 



} 

Где проблема?

Ну, существует небольшая проблема, что элемент появляется в последней позиции, и я хочу появиться в первой позиции.

+1

показать код адаптера –

+0

Я отредактировал мой пост – aldakur

ответ

1

У меня есть один способ

Создание обновления метода в вашем Adapter как

public void refresh(ArrayList<Aviso> itemsw) { 
    this.items = itemsw;  
    notifyDataSetChanged(); 
} 

Теперь вы просто назвали этот метод из вашего Activity

Aviso aviso = new Aviso(); 
aviso.setTitle("MMMMMMMMMMMMMMMMMMMMMM"); 
aviso.setDescription("Deskribapena"); 
aviso.setPubDate("Wed, 19 Mar 2016 12:40:00 GMT"); 
aviso.setDcDate("2016-03-19T12:40:00Z"); 
avisosList.add(aviso); 
adapter.refresh(avisosList); 

EDIT: Добавить элемент в определенном месте, используйте di fferent метод перегрузки Список_массивов

вместо

avisosList.add(aviso); 

использования

avisosList.add(index, aviso); //Indes is the position where you want your item to appear 
+0

Это работа, но почему новый элемент появился в последней позиции? Мне нужно прокрутить, чтобы посмотреть. – aldakur

+0

@aldakur Просто измените 'return items.get (items.size() - 1-позицию);' в 'getItem (...)' в вашем 'Adapter' (добавить элемент в первую позицию) –

+0

Извините, но 'return items.get (items.size() - 1 - позиция);' не работает. – aldakur

0

Обновите элементы списка в вашем адаптере.

Eg: 
adapter.setListItems(avisosList); 
adapter.notifyDataSetChanged(); 
0

Вам необходимо осуществить добавление элемента в адаптере вместо добавления элемента в список, из которого адаптер создано

public class AvisosEnListaAdapter extends BaseAdapter{ 
    protected Activity activity; 
    protected ArrayList<Aviso> items; 
    ........ 
    public void addItem(Aviso item){ 
     items.add(item); 
    } 
} 

затем

adapter.addItem(aviso); 
adapter.notifyDataSetChanged(); 
1

В любое время в вашей деятельности/фрагменте вы делаете любой avisosList = новый ArrayList(); или что-то подобное для повторного добавления новых элементов? Если это так, вы должны знать, что создается новый объект, поэтому он не ссылается на объект списка адаптеров, поэтому он не обновляется.

Вы можете выполнять только «новый ArrayList()» только один раз при управлении адаптером, а затем изменять содержимое списка каждый раз, когда хотите изменить адаптер, а затем, конечно, вызывать notifyDataSetChanged ();

Смежные вопросы