2014-01-02 2 views
0

Хотя каждый раз, когда я обдумывал данные, я вызывал notifyDataSetChanged(), функция getView() никогда не вызывалась. Вот мой класс, любой совет? СпасибоBaseAdapter, getView не вызывается, несмотря на то, что notifyDataSetChanged() вызывается

public class TripGroupAdapter extends BaseAdapter { 
    private static final String TAG = LogUtils.makeTag(TripGroupAdapter.class); 

    private Context mContext; 

    private List<TripGroup> mGroups; 

    private Query mQuery; 



    public TripGroupAdapter(final Context context, final List<TripGroup> groups, Query query) { 
     mContext = context; 
     mGroups = groups; 
     mQuery = query; 
    } 

    public void setGroups(final List<TripGroup> groups) { 
     mGroups = groups; 
     this.notifyDataSetChanged(); 
    } 


    public void addGroup(TripGroup group) { 
     if(mGroups == null) 
      mGroups = new LinkedList<TripGroup>(); 

     mGroups.add(group); 
     this.notifyDataSetChanged(); 
    } 


    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    @Override 
    public int getCount() { 
     return mGroups == null ? 0 : mGroups.size(); 
    } 

    @Override 
    public TripGroup getItem(final int position) { 
     if(getCount() == 0 || position < 0 || position >= getCount()) 
      return null; 
     else 
      return mGroups.get(position); 
    } 

    @Override 
    public long getItemId(final int position) { 
     TripGroup group = getItem(position); 

     if(group == null) 
      return -1; 
     else 
      return group.getId(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null) { 
      convertView = new TripListItemView(mContext); 
     } 

     TripListItemView tripView = (TripListItemView) convertView; 
     tripView.setBackgroundResource(R.drawable.selector_trip_result_card); 
     tripView.set(mGroups.get(position), mQuery, mCache); 

     return tripView; 
    } 

    public void setQuery(final Query query) { 
     mQuery = query; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void notifyDataSetChanged() { 

     super.notifyDataSetChanged(); 
    } 


} 
+0

Действительно ли вы устанавливаете адаптер в список? (или другой контент-дисплей) – Geoffroy

+0

@GrIsHu, конечно, поэтому я знаю, что getView не вызывается. Я установил точку останова внутри notifyDataSetChanged(), и он прыгнул туда. –

+0

@ Geoffroy да, я сделал. Я просто разместил здесь наиболее подходящий код. –

ответ

5

Я выяснил причину, сообщение здесь для тех, кто имеет ту же проблему. Я использую шину Otto для трансляции, а функция, которая ловит трансляцию и обновляет базовые данные setGroupsне запускается на uiThread. Таким образом, в этой функции, я должен был заставить его, как это:

getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       mTripGroupAdapter.setGroups(tripGroupsList); 
      } 
     }); 
0

Это не так в этом вопросе, но и другая возможность, что getView не вызывается после notifyDataSetChanged, убедитесь, что BaseAdapter методы

registerDataSetObserver(DataSetObserver observer) 
unregisterDataSetObserver(DataSetObserver observer) 

не переопределены.

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