2014-04-17 5 views
1

사용자 정의 ParseQueryAdapter을 사용하여 listview에서 데이터를로드합니다. 데이터가 없을 때 메시지를 표시하려고하지만 데이터가 비어 있지 않은 경우에도 메시지가 표시됩니다. 데이터가 아직로드되지 않아서라고 생각합니다. 나는 setEmptyView으로 시험해 보았고 if mAdapter.isEmpty()의 어댑터로 테스트를했다.Listview 빈 화면이 항상 표시됨

어댑터가 비어 있는지 테스트하기 전에 몇 초 기다려 보았지만 정상적으로 작동했지만 좋은 습관은 아닙니다.

public class CategoryEventsAdapter extends ParseQueryAdapter<Event> { 

    public CategoryEventsAdapter(Context context, final String c) { 

    super(context, new ParseQueryAdapter.QueryFactory<Event>() { 

      public ParseQuery<Event> create() { 
       ParseQuery<Event> query = new ParseQuery<Event>("Event"); 
       query.whereEqualTo("published", true); 
       query.whereEqualTo("category", c); 
       return query; 
      } 
     }); 
    } 

    @Override 
    public View getItemView(Event event, View v, ViewGroup parent) { 
     ... 
    } 
} 

그리고 단순히 조각에 전화 : 내가 구문 분석의 특정 부분을 사용하지 만보고 적이

mAdapter = new CategoryEventsAdapter(getActivity(), category); 
listview.setAdapter(mAdapter); 
if (mAdapter.isEmpty()) { 
    // show message 
} 
+0

ListView 레이아웃을 게시하고 빈보기를 설정하는 방법은 있습니까? – Libin

답변

2

내가 쿼리를 만들

내 사용자 정의 어댑터 docs, 쿼리가 비동기 것 같습니다. 대신 당신은 어쩌면이 시도 할 수 있습니다 : 쿼리가 완료되면 비어인지 아닌지

mAdapter = new CategoryEventsAdapter(getActivity(), category); 

// add a listener for when the query is done. 
mAdapter.addOnQueryLoadListener(new OnQueryLoadListener<ParseObject>() { 
    public void onLoaded(List<ParseObject> objects, ParseException e) { 
     // Check if empty here and show message. 
     if (objects.size == 0){ 
      // show message 
     } 
    } 
}); 

listview.setAdapter(mAdapter); 

그래서, 그렇게 당신이 결정할 수 onLoaded를 호출해야합니다. onLoaded에서 objects 매개 변수의 수를 확인할 수 있습니다. 이 시점에서 mAdapter.isEmpty을 수행하면 어댑터에 이미 설정되어 있는지 확실하지 않습니다.

+0

좋습니다! 고맙습니다! – tsil

0

"빈"플레이스 홀더를 선택할 수있는 내 ParseQueryAdapter 구현입니다. 밖에서 adapter.setEmptyLayoutId(R.layout.empty)으로 전화하면됩니다.

public class ParseAdapter extends ParseQueryAdapter { 

    private final static int EMPTY_VIEW = 2; 
    private int emptyViewLayoutId; 
    private boolean isEmpty; 

    public ParseAdapter(Context c, QueryFactory<? extends ParseObject> q) { 
     super(c, q); 

     addOnQueryLoadListener(new OnQueryLoadListener() { 
      @Override 
      public void onLoading() { 
       isEmpty = false; 
      } 

      @Override 
      public void onLoaded(List list, Exception e) { 
       if (list == null || list.size() == 0) { 
        isEmpty = true; 
       } 
      } 
     }); 
    } 

    @Override 
    public void notifyDataSetChanged() { 
     isEmpty = false; 
     super.notifyDataSetChanged(); 
    } 

    public void setEmptyLayoutId(int emptyViewLayoutId) { 
     this.emptyViewLayoutId = emptyViewLayoutId; 
    } 


    @Override 
    public View getItemView(ParseObject object, View v, ViewGroup parent) { 
     if (isEmpty) { 
      v = View.inflate(getContext(), emptyViewLayoutId, null); 
      return v; 
     } 

     v = v != null ? v : View.inflate(getContext(), rowLayoutId, null); 
     //do whatever you want on v 
     return v; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return super.getViewTypeCount() + 1; //3 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return isEmpty ? EMPTY_VIEW : super.getItemViewType(position); 
    } 

    @Override 
    public int getCount() { 
     return isEmpty ? 1 : super.getCount(); 
    } 
} 

당신은 그렇지 않으면 빈 경우, getItemView()이 경우에 호출되지 않습니다 때문에 항목보기 유형을 추가해야합니다. getCount()을 1을 반환하도록 재정의하면 ParseQueryAdaptergetView() 내부의보기 유형에 대해 몇 가지 검사를 수행하고 getItemView()에 통화를 전달하지 않으므로 충분하지 않습니다.

관련 문제