2014-01-25 2 views
3

저는 Parse.com 프레임 워크를 사용하고 있으며 최근에로드 - 더 (onScroll) ListView를 코드에 추가했습니다. 그러나 load-more 프로세스가 시작될 때마다 이전 항목도 다시로드된다는 것을 알게되었습니다. query.setSkip(someCustomSkip);을 추가하면 load-more 프로세스 후에 (someCustomSkip) 번호없이 항목을 삭제합니다.모든 ListView 항목을 다시로드하지 않는 방법은 무엇입니까?

당신이 어떤 식으로 생각하니, 어떻게 query.setSkip()을 사용할 수 있습니까? 방법과 또한 경건한 것들을 보존?

1) ListView를 최초 위치를 제한하는 위치하도록 스크롤 한 후 5 위치 query.setLimit(mListView.getCount + 5)

ListView's first position, before scrolling to 5th position (<code>query.setLimit(mListView.getCount + 5</code>)

2)의 ListView 스크롤 전에. 그것은이 위치에 나를 던져 세트 건너 - 처음 5 개 항목

ListView after scrolling to limit-position. It throws me to this position and sets skip - hides first 5 items

또한이 질문에 대한 중요한 내 코드의 일부 숨 깁니다 : 어떤 제안에 대해 사전에

public class Fragment1 extends Fragment { 
    static ListView mListView; 
    static AnimalAdapter mAdapter; 
    static ProgressBar mProgressBar; 
    static EditText mEditText; 
    static LayoutInflater inflater; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     final View rootView = inflater.inflate(R.layout.animalsfrag, container, false); 
     mListView = (ListView)rootView.findViewById(R.id.animal_list); 

     View header = getActivity().getLayoutInflater().inflate(R.layout.header, null); 

     header.setPadding(2, 8, 4, 2); 
     mListView.setVisibility(View.INVISIBLE); 
     mListView.requestFocus(); 
     mListView.addHeaderView(header); 

     View footie = getActivity().getLayoutInflater().inflate(R.layout.footer, null); 
     mListView.addFooterView(footie); 
     footie.setVisibility(View.INVISIBLE); 


     mProgressBar = (ProgressBar) rootView.findViewById (R.id.loading_animals); 
     mProgressBar.setVisibility(View.VISIBLE); 

     RemoteDataTask task = new RemoteDataTask(); 
     task.execute(); 



     return rootView; 
    } 



    public void updateData() { //method, which updates my data 
     mListView = (ListView)getView().findViewById(R.id.animal_list);  
    final ParseQuery<Animal> query = ParseQuery.getQuery(Animal.class); 


    query.setCachePolicy(CachePolicy.NETWORK_ONLY); 
    query.orderByAscending("animal"); 


    query.setLimit(mListView.getCount() + 5); 
    if (mListView.getCount() > 5) { 
     query.setSkip(5); 
    } 

    query.findInBackground(new FindCallback<Animal>() { 

     @Override 
      public void done(List<Animal> animals, ParseException error) { 

       if(animals != null){ 
        mAdapter.clear(); 

       mProgressBar = (ProgressBar) getView().findViewById (R.id.loading_animals); 
       mProgressBar.setVisibility(View.INVISIBLE); 
      RelativeLayout footie = (RelativeLayout) getView().findViewById(R.id.footerview); 
      footie.setVisibility(View.VISIBLE); 

      for (int i = 0; i < animals.size(); i++) { 


         mAdapter.add(animals.get(i)); 







        } 
       } 
      } 
     }); 
    } 




    private class RemoteDataTask extends AsyncTask<Void, Void, Void> { 


     @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); } 

     @Override 
      protected Void doInBackground(Void... params) { 

       return null; 



     } 


     @Override 
      protected void onPostExecute(Void result) { 


       mListView = (ListView) getView().findViewById(R.id.animal_list); 

       mEditText = (EditText) getView().findViewById(R.id.search_animal); 

       mAdapter = new AnimalAdapter(getActivity(), new ArrayList<Animal>()); 

       mListView.setVisibility(View.VISIBLE); 
       mListView.setTextFilterEnabled(true); 
       mListView.setAdapter(mAdapter); 




       mListView.setOnScrollListener(new OnScrollListener() { 
     //my OnScrollListener 

        @Override 
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
          int totalItemCount) { 
         final int lastItem = firstVisibleItem + visibleItemCount; 
         if(lastItem == totalItemCount) { 




         if (mListView.getCount() > 20) { 

          RelativeLayout footie = (RelativeLayout) getView().findViewById(R.id.footerview); 

          mListView.removeFooterView(footie); 

           } 





          else{ 

           updateData(); 


          } 

         } 

        } 


        @Override 
        public void onScrollStateChanged(AbsListView view, 
          int scrollState) { 

         if (SCROLL_STATE_TOUCH_SCROLL == scrollState) { 
          View currentFocus = getActivity().getCurrentFocus(); 
          if(currentFocus != null) { 
           currentFocus.clearFocus(); 
          } 
         } 



        } 

       }); 
       mListView.setAdapter(mAdapter); 

       mEditText.addTextChangedListener(new TextWatcher(){ 

        @Override 
        public void afterTextChanged(Editable s) {} 

        @Override 
        public void beforeTextChanged(CharSequence s, 
          int start, int count, int after) {} 

        @Override 
        public void onTextChanged(CharSequence s, int start, 
          int before, int count) { 

         System.out.println("Text ["+s+"]"); 
         mAdapter.getFilter().filter(s.toString()); 
         } 
       }); 

       } 

      } 
     } 

감사합니다 !

답변

1

지금 사용하고 있는지 모르겠지만 Parse는이 모든 것을 담당하는 ParseQueryAdapter 클래스를 제공합니다. 생성자 중 하나는 Context이고 QueryFactory입니다. QueryFactorycreate()을 무시하고 ParseQuery을 반환하도록합니다.

ParseQuery에는 캐시 정책을 설명하는 열거 형이 있습니다. 매번 서버에 ping을 수행하지 않으려면 먼저 캐시를 확인하도록 캐시 정책을 설정 한 다음 ParseObject이 로컬 chache에서 발견되지 않으면 서버를 조회하십시오.

페이지 매김은 기본적으로 ParseQueryAdapter에서 사용하도록 설정됩니다. 그것은 모든 (당신을 위해 "부하 더 많은 데이터"라고도보기를 돌보아 여기

당신에게 도움이되는 문서에서 약간의 코드이다. 다음

ParseQueryAdapter<ParseObject> adapter = 
    new ParseQueryAdapter<ParseObject>(this, new ParseQueryAdapter.QueryFactory<ParseObject>() { 
    public ParseQuery<ParseObject> create() { 
     // Here we can configure a ParseQuery to our heart's desire. 
     ParseQuery query = new ParseQuery("Band"); 
     query.whereContainedIn("genre", Arrays.asList({ "Punk", "Metal" })); 
     query.whereGreaterThanOrEqualTo("memberCount", 4); 
     query.orderByDescending("albumsSoldCount"); 
     query.setCachePolicy(ParseQuery.CachePolicy.CACHE_ELSE_NETWORK) 
     return query; 
    } 
    }); 

방금 ​​어댑터를 설정

+0

감사합니다. 나는 그 어댑터에 대해 몰랐다! 그리고 그것을 무시하고 추가 어댑터 데이터를 추가 할 수 있습니까? MyAdapter extends ParseQueryAdapter'를 사용해야합니까? – marson

+0

예, 쿼리에 따라'create()'를 커스터마이징해야합니다. 내 것이 단지 예였습니다. – Emmanuel

+0

다시 한번 감사 드리며, 많은 도움이되었습니다. 나는 그것을 할거야 – marson

0

미래에이 문제에 어려움을 겪고있는 사람들을 위해 정수에 대한 항목 수를 할당 할 수 있습니다 (내 경우에는 마비). 그런 다음 비동기 배경을 실행하기 전에 함수를 사용하여 목록보기에 더 많은 결과를로드하려면 목록보기에 나타나는 항목 수가 쿼리 항목. 그렇지 않은 경우 비동기 태스크를 다시 실행하여 더 많은 결과를 추가 할 수 있습니다.

L3.setOnScrollListener(new OnScrollListener() { 

      @Override 
      public void onScrollStateChanged(AbsListView view, 
        int scrollState) { // TODO Auto-generated method stub 
       int threshold = 1; 
       int count = L3.getCount(); 

       if (scrollState == SCROLL_STATE_IDLE) { 
        if (L3.getLastVisiblePosition() >= count 
          - threshold) { 
         // Execute LoadMoreDataTask AsyncTask 

        // Toast.makeText(getApplicationContext(), count- threshold+"", 300).show(); 

         if(L3.getLastVisiblePosition()+ threshold <numb) 
         { 
          //Toast.makeText(getApplicationContext(), L3.getLastVisiblePosition()+"", 300).show(); 
          new LoadMoreDataTask().execute(); 
         } 
         else 
         { 
          Toast.makeText(getApplicationContext(), "لا توجد مزيد من النتائج حاليآ...", 300).show(); 
         } 

        } 
       } 
      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, 
        int visibleItemCount, int totalItemCount) { 
       // TODO Auto-generated method stub 

      } 

     }); 

희망!

관련 문제