2016-06-23 3 views
0

Это происходит очень часто, но я действительно не знаю, что делать сейчас.notifyDataSetChanged() не работает после добавления

Вот код из фрагмента:

общественного класса MainFragment расширяет фрагмент {

private ListView listView; 
private static TicketsAdapter ticketsAdapter; 
private static ArrayList<Ticket> tickets = new ArrayList<Ticket>(); 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    final View view = inflater.inflate(R.layout.fragment_main, container, false); 

    listView = (ListView) view.findViewById(R.id.list_tickets);   
    ticketsAdapter = new TicketsAdapter(tickets); 
    listView.setAdapter(ticketsAdapter); 

    return view; 
} 
public static void addTicket(Ticket ticket){ 
    tickets.add(ticket); 
    ticketsAdapter.notifyDataSetChanged(); 
    Log.d(A.TAG,"tickets =" + tickets.size()); 
} 

}

Теперь журнал показывает, что количество приращения билетов, но ListView не обновляется

вот адаптер:

public class TicketsAdapter extends BaseAdapter { 

    private ArrayList<Ticket> tickets = new ArrayList<Ticket>(); 
    private LayoutInflater lInflater; 
    private ViewHolder viewHolder; 

    public TicketsAdapter(ArrayList<Ticket> tickets){ 
     this.tickets.clear(); 
     this.tickets.addAll(tickets); 
     lInflater = (LayoutInflater) MainActivity.getActivity() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null){ 
      convertView = lInflater.inflate(R.layout.list_item, parent, false); 
      viewHolder = new ViewHolder(); 

      //finding views etc 

      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     }  
     Ticket ticket = (Ticket) getItem(position); 

     //Showing data on views 

     return convertView; 
    } 

    @Override 
    public int getCount() { 
     return tickets.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return tickets.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return Long.parseLong(tickets.get(position).getId()); 
    }; 

    static class ViewHolder{ 
     //bunch of views 
    } 
} 
+2

Удалить 'this.tickets.clear(); this.tickets.addAll (билеты); 'в вашем адаптере и поместите это' this.tickets = tickets; ' –

+0

да, это работает. но почему? – user2976267

+0

Это не та же переменная, поэтому, когда вы добавляете элемент в свой фрагмент, это не добавляет его в адаптер, потому что это не тот же список. Теперь это то же самое. –

ответ

1

Вы создаете новый список внутри вашего адаптера и просто добавляете в него элементы из списка фрагментов. Список внутри вашего адаптера не ссылается на список в вашем фрагменте (потому что это новый список), поэтому ваш адаптер не может знать об изменениях во внешнем списке.

Вы можете сделать что-то вроде:

private ArrayList<Ticket> tickets; 
    private LayoutInflater lInflater; 
    private ViewHolder viewHolder; 

    public TicketsAdapter(ArrayList<Ticket> tickets) { 
     this.tickets = tickets; 
     lInflater = (LayoutInflater) MainActivity.getActivity() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

Если вы делаете это таким образом, ваш адаптер будет ссылки на один и тот же список, что исходит от вашего фрагмента (потому что вы не посылаете новый список, но ссылка к списку в вашем классе фрагмента), и изменения, сделанные в вашем фрагменте, будут отображаться в вашем адаптере после вызова notifyDataSetChanged().

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

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