2010-03-25 26 views
0

我使用Commonsguy與SimpleAdapter的EndlessAdapter。當我向下滾動而沒有問題時,我可以加載數據,但是當我向上滾動時,我有一個NullPointerException異常。問題是在方法使用EndlessAdapter與SimpleAdapter的NullPointerException

@Override 
public View getView(int position, View convertView,ViewGroup parent) { 
    return wrapped.getView(position, convertView, parent); 
} 

從類AdapterWrapper

撥打wrapped.getView(position, convertView,parent)引發了例外,我不知道爲什麼。

這是我實現的EndlessAdapter

//Inner class in SearchTextActivity 
    class DemoAdapter extends EndlessAdapter { 

     private RotateAnimation rotate = null; 

     DemoAdapter(ArrayList<HashMap<String, String>> result) { 
     super(new SimpleAdapter(SearchTracksActivity.this, 
     result, 
     R.layout.textlist_item, 
     PROJECTION_COLUMNS, 
     VIEW_MAPPINGS)); 

     rotate = new RotateAnimation(0f, 
     360f, 
     Animation.RELATIVE_TO_SELF, 
     0.5f, 
     Animation.RELATIVE_TO_SELF, 
     0.5f); 
     rotate.setDuration(600); 
     rotate.setRepeatMode(Animation.RESTART); 
     rotate.setRepeatCount(Animation.INFINITE); 
     } 

     @Override 
     protected View getPendingView(ViewGroup parent) { 
     View row=getLayoutInflater().inflate(R.layout.textlist_item, null); 

     View child=row.findViewById(R.id.title); 
     child.setVisibility(View.GONE); 

     child=row.findViewById(R.id.username); 
     child.setVisibility(View.GONE); 

     child=row.findViewById(R.id.throbber); 
     child.setVisibility(View.VISIBLE); 
     child.startAnimation(rotate); 

     return row; 
     } 


     @Override 
     @SuppressWarnings("unchecked") 
     protected void rebindPendingView(int position, View row) { 
     HashMap<String, String> res = (HashMap<String, String>)getWrappedAdapter().getItem(position); 


     View child=row.findViewById(R.id.title); 
     ((TextView)child).setText(res.get("title")); 
     child.setVisibility(View.VISIBLE);  

     child=row.findViewById(R.id.username); 
     ((TextView)child).setText(res.get("username")); 
     child.setVisibility(View.VISIBLE); 

     ImageView throbber=(ImageView)row.findViewById(R.id.throbber); 
     throbber.setVisibility(View.GONE); 
     throbber.clearAnimation(); 

     } 

     boolean mFinal = true; 

     @Override 
     protected boolean cacheInBackground() { 

     EditText searchText = (EditText)findViewById(R.id.searchText); 
     String textToSearch = searchText.getText().toString(); 

     Util.getSc().searchText(textToSearch , offset, limit, new ResultListener<ArrayList<Text>>() { 

     @Override 
     public void onError(Exception e) { 
     e.toString(); 
     mFinal = false; 
     } 

     @Override 
     public void onSuccess(ArrayList<Text> result) { 


     if(result.size() == 0){ 
      mFinal = false; 
     }else{ 
      texts.addAll(result); 

      offset++; 
     } 
     } 
     }); 

     return mFinal; 
     } 

     @Override 
     protected void appendCachedData() { 

     for(Text text : texts){ 
     result.add(text.getMapValues()); 
     } 
     texts.clear(); 
     } 
    } 

我使用這種方式:

public class SearchTextActivity extends AbstractListActivity { 

private static final String[] PROJECTION_COLUMNS = new String[] { 
    TextStore.Text.TITLE, 
    TextStore.Text.USER_NAME}; 

private static final int[] VIEW_MAPPINGS = new int[] { 
    R.id.Text_title, 
    R.id.Text_username}; 

ArrayList<HashMap<String, String>> result; 

static ArrayList<Text> texts; 
static int offset = 0; 
static int limit = 1; 

@Override 
void onAbstractCreate(Bundle savedInstance) { 
    setContentView(R.layout.search_tracks); 
    setupViews(); 
} 

private void setupViews() { 

    ImageButton searchButton = (ImageButton)findViewById(R.id.searchButton); 
    updateView(); 
} 

SimpleAdapter adapter; 

void updateView(){ 
    if(result == null) { 
    result = new ArrayList<HashMap<String, String>>(); 
    } 

    if(tracks == null) { 
    texts = new ArrayList<Text>(); 
    } 
} 

public void sendQuery(View v){ 
    offset = 0; 
    texts.clear(); 
    result.clear(); 

    setListAdapter(new DemoAdapter(result)); 
} 
} 

有誰知道可能是什麼問題呢?

+0

我還沒有嘗試SimpleAdapter與EndlessAdapter。如果'NullPointerException'直接位於'wrapped.getView(position,convertView,parent)'行,那麼'wrapped'必須爲'null'。 – CommonsWare 2010-03-25 23:14:13

+0

感謝您的回覆,但我已檢查'包裹'不爲空。這個錯誤來自wrapped.getView(position,convertView,parent)。它位於SimpleAdapter中。也許是與索引'位置'有關的問題,但是有關於這個位置的觀點。我不知道那裏發生了什麼。 – ahmontero 2010-03-26 09:16:49

回答

1

它位於SimpleAdapter中。

我想先擺脫EndlessAdapter的開始,只是有你的清單上的SimpleAdapter

如果這樣的話,那麼EndlessAdapter可能會有一個錯誤,使用它所包含的適配器 - 在這種情況下,我需要一個演示錯誤的示例項目。

如果SimpleAdapter在沒有EndlessAdapter的情況下失敗,則需要更多地調查您如何設置SimpleAdapter

+0

我一直在測試,我已經能夠重新創建錯誤。如果我使用SimpleAdpater一切正常,但如果我使用SimpleAdapter的EndlessAdapter,則在描述之前存在問題。 我在Eclipse中製作了一個演示項目,錯誤信息如下:http://bit.ly/alTapV 感謝您的幫助 – ahmontero 2010-03-26 23:08:38

+0

'EndlessAdapter'不會在'SimpleAdapter'中隨時使用。我不推薦'SimpleAdapter',期間。 SimpleAdapter解決了ArrayAdapter不能更有效地解決問題(數據複製越少= CPU時間越少,垃圾收集越少等)。 – CommonsWare 2010-03-27 00:15:56

+0

好吧,我明白了。然後我會嘗試使用ArrayAdapter。謝謝你的時間。 – ahmontero 2010-03-27 12:03:22