2013-11-26 3 views
0

현재 목록보기를 스크롤하고 새로 고침을 빠르게하는 데 크래시 문제가 있습니다. 이클립스는이 코드에 나에게Android : ArrayAdapter가 범위를 벗어남. 새로 고침 후 getView에서 충돌이 발생합니다.

11-25 23:58:51.511: E/AndroidRuntime(29736): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1 

을주고있다 :

  mAdapter = new ArrayAdapter<Link>(getActivity(), R.layout.link_item, 
      mLinkManager.getLinks()) { 
     @Override 
     public int getCount() { 
      return mLinkManager.getLinks().size(); 
     } 

     public long getItemId(int position) { 
      return mLinkManager.getLinks().get(position).getId().hashCode(); 
     } 

     public Link getItem(int position) { 
      return mLinkManager.getLinks().get(position); 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       convertView = getActivity().getLayoutInflater().inflate(
         R.layout.link_item, null); 
      } 

      Link link = mLinkManager.getLinks().get(position); 

      // Set textview stuff from links here 

      return convertView; 
     }; 
    }; 

    setListAdapter(mAdapter); 
} 

충돌은 마지막 줄에 발생합니다. 새로 고침을 누르면 getView() 메서드를 중지하는 방법이 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

private class RefreshLinksTask extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 
     Log.d(TAG, "Refreshing..."); 
     if (mIsRefreshing || mIsDownloading) 
      cancel(true); 
     mIsRefreshing = true; 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     mLinkManager.refreshLinks(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (mAdapter != null) { 
      mAdapter.notifyDataSetChanged(); 
     } 
     else { 
      createAdapter(); 
     } 
     mIsRefreshing = false; 
     super.onPostExecute(result); 
    } 
} 
+0

이 줄에서 충돌이 발생합니까 ?? 링크 링크 = mLinkManager.getLinks(). get (position); –

+0

위치가 1이면 0이어야합니다. –

+1

getItemId 및 getItem (position) 메서드를 구현 했습니까? – GrIsHu

답변

2

backing 목록에서 항목을 변경 한 직후 notifyDataSetChanged()으로 전화해야합니다. 내 제안은 doInBackground()에서 링크 목록을 반환하고 onPostExecute()에서 설정하고 notifyDataSetChanged()으로 전화하는 것입니다.