2012-02-02 64 views
0

總之newView沒有被要求每個列表項,是日誌:自定義的ListView NewView的問題

01-06 20:04:15.957: D/NoteListActivity(2771): newView Note ID:12 
01-06 20:04:16.087: D/NoteItemView(2771): updateActionText Note ID:12 Action:Stamp 
01-06 20:04:16.117: D/NoteListActivity(2771): bindView Note ID:12 
01-06 20:04:16.329: D/NoteListActivity(2771): newView Note ID:13 
01-06 20:04:16.477: D/NoteItemView(2771): updateActionText Note ID:13 Action:Stamp 
01-06 20:04:16.497: D/NoteListActivity(2771): bindView Note ID:13 
01-06 20:04:16.729: D/NoteListActivity(2771): newView Note ID:14 
01-06 20:04:16.867: D/NoteItemView(2771): updateActionText Note ID:14 Action:Stamp 
01-06 20:04:16.887: D/NoteListActivity(2771): bindView Note ID:14 
01-06 20:04:17.107: D/NoteListActivity(2771): newView Note ID:15 
01-06 20:04:17.247: D/NoteItemView(2771): updateActionText Note ID:15 Action:Stamp 
01-06 20:04:17.269: D/NoteListActivity(2771): bindView Note ID:15 
01-06 20:04:17.487: D/NoteListActivity(2771): newView Note ID:16 
01-06 20:04:17.639: D/NoteItemView(2771): updateActionText Note ID:16 Action:Stamp 
01-06 20:04:17.657: D/NoteListActivity(2771): bindView Note ID:16 
01-06 20:04:17.897: D/NoteListActivity(2771): newView Note ID:17 
01-06 20:04:18.007: D/dalvikvm(2771): GC_EXTERNAL_ALLOC freed 99K, 47% free 2902K/5447K, external 2888K/2971K, paused 53ms 
01-06 20:04:18.127: D/NoteItemView(2771): updateActionText Note ID:17 Action:Count 
01-06 20:04:18.147: D/NoteListActivity(2771): bindView Note ID:17 
01-06 20:04:18.367: D/NoteListActivity(2771): newView Note ID:18 
01-06 20:04:18.517: D/NoteItemView(2771): updateActionText Note ID:18 Action:Stamp 
01-06 20:04:18.537: D/NoteListActivity(2771): bindView Note ID:18 
01-06 20:04:36.488: W/KeyCharacterMap(2771): No keyboard for id 0 
01-06 20:04:36.488: W/KeyCharacterMap(2771): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
01-06 20:04:38.118: D/NoteListActivity(2771): newView Note ID:19 
01-06 20:04:38.257: D/NoteItemView(2771): updateActionText Note ID:19 Action:Stamp 
01-06 20:04:38.277: D/NoteListActivity(2771): bindView Note ID:19 
01-06 20:04:38.767: D/NoteListActivity(2771): newView Note ID:20 
01-06 20:04:38.849: D/NoteItemView(2771): updateActionText Note ID:20 Action:Stamp 
01-06 20:04:38.867: D/NoteListActivity(2771): bindView Note ID:20 
01-06 20:04:39.327: D/NoteItemView(2771): updateActionText Note ID:12 Action:Stamp 
01-06 20:04:39.347: D/NoteListActivity(2771): bindView Note ID:21 
01-06 20:04:39.857: D/dalvikvm(2771): GC_EXTERNAL_ALLOC freed 84K, 47% free 2944K/5511K, external 3593K/3852K, paused 59ms 
01-06 20:04:39.997: D/NoteItemView(2771): updateActionText Note ID:13 Action:Stamp 
01-06 20:04:40.017: D/NoteListActivity(2771): bindView Note ID:22 
01-06 20:04:40.537: D/NoteItemView(2771): updateActionText Note ID:14 Action:Stamp 
01-06 20:04:40.557: D/NoteListActivity(2771): bindView Note ID:23 
01-06 20:04:41.087: D/NoteItemView(2771): updateActionText Note ID:15 Action:Stamp 
01-06 20:04:41.107: D/NoteListActivity(2771): bindView Note ID:24 
01-06 20:04:41.617: D/NoteItemView(2771): updateActionText Note ID:16 Action:Stamp 
01-06 20:04:41.639: D/NoteListActivity(2771): bindView Note ID:25 
01-06 20:06:23.858: D/NoteItemView(2771): updateActionText Note ID:18 Action:Stamp 
01-06 20:06:23.878: D/NoteListActivity(2771): bindView Note ID:18 
01-06 20:06:24.267: D/dalvikvm(2771): GC_EXTERNAL_ALLOC freed 79K, 47% free 2944K/5511K, external 4681K/4733K, paused 53ms 
01-06 20:06:26.519: D/NoteItemView(2771): updateActionText Note ID:15 Action:Stamp 
01-06 20:06:26.537: D/NoteListActivity(2771): bindView Note ID:17 
01-06 20:06:26.927: D/dalvikvm(2771): GC_EXTERNAL_ALLOC freed 17K, 47% free 2944K/5511K, external 5020K/5295K, paused 60ms 
01-06 20:06:26.987: D/NoteItemView(2771): updateActionText Note ID:12 Action:Stamp 
01-06 20:06:27.008: D/NoteListActivity(2771): bindView Note ID:16 
01-06 20:06:27.247: D/NoteItemView(2771): updateActionText Note ID:13 Action:Stamp 
01-06 20:06:27.267: D/NoteListActivity(2771): bindView Note ID:15 
01-06 20:06:27.517: D/NoteItemView(2771): updateActionText Note ID:14 Action:Stamp 
01-06 20:06:27.537: D/NoteListActivity(2771): bindView Note ID:14 
01-06 20:06:28.397: D/NoteItemView(2771): updateActionText Note ID:16 Action:Stamp 
01-06 20:06:28.417: D/NoteListActivity(2771): bindView Note ID:13 
01-06 20:06:28.809: D/NoteItemView(2771): updateActionText Note ID:19 Action:Stamp 
01-06 20:06:28.837: D/NoteListActivity(2771): bindView Note ID:12 
01-06 20:06:29.167: D/NoteItemView(2771): updateActionText Note ID:12 Action:Stamp 
01-06 20:06:29.189: D/NoteListActivity(2771): bindView Note ID:16 
01-06 20:06:29.477: D/NoteItemView(2771): updateActionText Note ID:15 Action:Stamp 
01-06 20:06:29.497: D/NoteListActivity(2771): bindView Note ID:17 
01-06 20:06:29.688: D/NoteItemView(2771): updateActionText Note ID:18 Action:Stamp 
01-06 20:06:29.707: D/NoteListActivity(2771): bindView Note ID:18 
01-06 20:06:31.807: D/NoteItemView(2771): updateActionText Note ID:20 Action:Stamp 
01-06 20:06:31.827: D/NoteListActivity(2771): bindView Note ID:19 
01-06 20:06:32.267: D/NoteItemView(2771): updateActionText Note ID:13 Action:Stamp 
01-06 20:06:32.288: D/NoteListActivity(2771): bindView Note ID:20 
01-06 20:06:32.537: D/NoteItemView(2771): updateActionText Note ID:14 Action:Stamp 
01-06 20:06:32.567: D/NoteListActivity(2771): bindView Note ID:21 
01-06 20:06:32.867: D/NoteItemView(2771): updateActionText Note ID:16 Action:Stamp 
01-06 20:06:32.887: D/NoteListActivity(2771): bindView Note ID:22 
01-06 20:06:33.127: D/NoteItemView(2771): updateActionText Note ID:19 Action:Stamp 
01-06 20:06:33.147: D/NoteListActivity(2771): bindView Note ID:23 
01-06 20:06:33.677: D/NoteItemView(2771): updateActionText Note ID:15 Action:Stamp 
01-06 20:06:33.697: D/NoteListActivity(2771): bindView Note ID:24 
01-06 20:06:34.187: D/NoteItemView(2771): updateActionText Note ID:14 Action:Stamp 
01-06 20:06:34.207: D/NoteListActivity(2771): bindView Note ID:25 
01-06 20:06:34.447: D/NoteItemView(2771): updateActionText Note ID:13 Action:Stamp 
01-06 20:06:34.467: D/NoteListActivity(2771): bindView Note ID:21 
01-06 20:06:34.647: D/NoteItemView(2771): updateActionText Note ID:20 Action:Stamp 
01-06 20:06:34.667: D/NoteListActivity(2771): bindView Note ID:20 
01-06 20:06:34.847: D/NoteItemView(2771): updateActionText Note ID:18 Action:Stamp 
01-06 20:06:34.867: D/NoteListActivity(2771): bindView Note ID:19 

這裏是適配器:

class NoteItemAdapter extends CursorAdapter { 

    private LayoutInflater mInflater; 

    public NoteItemAdapter(Context context, Cursor c) { 
     super(context, c); 
     mInflater = LayoutInflater.from(context); 
    } 

    public NoteItemAdapter(Context context, Cursor c, boolean autoRequery) { 
     super(context, c, autoRequery); 
     mInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     final NoteListItemHolder noteItemHolder = (NoteListItemHolder)view.getTag(); 
     NoteCursor nc = (NoteCursor)cursor; 

     initView(noteItemHolder, nc); 

     Log.d(TAG, String.format("bindView Note ID:%s", nc.getColId())); 
    } 

    private void initView(final NoteListItemHolder noteItemHolder, NoteCursor nc) 
      throws NotFoundException { 
     noteItemHolder.getBase().setClickable(false); 
     noteItemHolder.getBase().setLongClickable(true); 
     noteItemHolder.getTopText().setText(nc.getColTitle()); 
     noteItemHolder.getBottomText().setText(nc.getColNote()); 
     byte[] icon = nc.getColActionIcon(); 
     if (icon != null) { 
      noteItemHolder.getIconButton().setImageBitmap(BitmapUtil.BitmapFromByteArray(icon)); 
     } else { 
      NoteAction actionType = NoteListItemHolder.NoteActionFromInt(nc.getColActionType()); 
      int actionIconResId = R.drawable.note_action_icon_none; 
      switch (actionType) { 
      case Span: 
       actionIconResId = R.drawable.note_action_icon_span; 
       break; 
      case Stamp: 
       actionIconResId = R.drawable.note_action_icon_stamp; 
       break; 
      case Count: 
       actionIconResId = R.drawable.note_action_icon_count; 
       break; 
      default: 
       //NOOP 
       break; 
      } 
      noteItemHolder.getIconButton().setImageBitmap(((BitmapDrawable)getResources().getDrawable(actionIconResId)).getBitmap()); 
     } 
     noteItemHolder.getIconButton().setClickable(true); 
     noteItemHolder.getIconButton().setLongClickable(false); 
     noteItemHolder.updateActionText(); 

     noteItemHolder.getIconButton().setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View iconView) { 
       noteItemHolder.doAction(); 
      } 
     }); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup viewGroup) { 
     View row = mInflater.inflate(R.layout.note_list_item, viewGroup, false); 
     NoteCursor nc = (NoteCursor)getCursor(); 
     NoteListItemHolder wrapper = new NoteListItemHolder(row, nc.getColId()); 
     row.setTag(wrapper); 

     Log.d(TAG, String.format("newView Note ID:%s", nc.getColId())); 

     return row; 
    } 
} 

我一直在讀一本一堆關於類似的問題,我只是無法弄清楚!

項目的第一頁(當列表視圖被加載時可見)總是正確的,但是當您至少滾動列表項中的一個文本視圖時總是正確的,並且至少有一個在新的項目(兩個文本視圖正在從始終調用的bindView獲取文本更新)。這讓我相信這個問題不在適配器中,但是如日誌所示,newView不會被調用到項目21及更高版本。

而且......對於額外的好處,當您向後滾動時,那些正確的不再是;他們現在的行爲與列表中的其他部分相似。

那麼,有什麼想法的傢伙?

+2

我很想忽略你的意見,但既然你有如此高的聲譽...我通常不會提出簡單或直接的問題,因此,並不總是對他們的答案(或合適的人根本沒有出現)。因此,我不會將部分或「非常接近」的回答標記爲答案,因爲這隻會傳播當前在整個互聯網中發生狂妄的混淆。當我的問題得到充分回答時,他們會得到適當的注意(可以自行檢查)。 – LostNomad311 2012-02-02 04:39:45

+0

* *咳嗽* *接受這一個* *咳嗽* * :-P – dmon 2012-02-02 14:15:37

回答

-1

所以@dmon指出,這些意見正在被重用(是的,我知道我應該已經得到了這個概念)。在我的持有人中,筆記ID等被存儲並隨後用於填充一些子視圖。僅供參考我正在將這些列表項otimizing到持有者模式,並思考爲什麼不把文本更新在那裏,因爲我將數據緩存 - 然後BOOM!

現在我明白,視圖並不總是顯示相同的數據,我已經刪除了邏輯,一切都很好!

非常感謝@dmon爲解釋這個概念,我沒有把握(並希望這有助於其他一些無望的代碼猴)!

下面是更改的行(我只是路過的說明ID的持有者現在):

noteItemHolder.updateActionText(); 
//is now 

noteItemHolder.updateActionText(noteID); 

noteItemHolder.doAction(); 
//is now 

noteItemHolder.doAction(noteID); 
2

這是預期的。 CursorAdapter只是爲您回收視圖。 newView()只會針對第一個屏幕(可能還有其他幾個項目)調用,但對於所有其他視圖,您在newView()中返回的視圖將被回收,並且只會通過bindView()方法運行。在這些情況下,問題通常是其中一個字段未返回到「默認」狀態,並且陳舊的數據通過。這就是爲什麼你有「不正確」的數據。我在你發佈的bindView()代碼中看不到任何明顯的錯誤,但是如果我不得不猜測,我會說問題出在noteItemHolder.updateActionText()方法中。

+0

我現在看到光線,這是我的理解,可以用同一個持有者生存和死亡。我的問題是我在持有者中持有的數據是特定於顯示在視圖中的行,我知道這些數據會改變。 – LostNomad311 2012-02-02 04:09:21