2011-12-06 38 views
0

我的ListView是一個簡單的ListView,但他有問題。
我正在使用一個SimpleCursorAdapter,調用adapter,我希望TextView加粗,並在單擊某個項目時更改背景。我也想要其他以前受影響的ListView項目重置自己。在ListView中重置視圖

以下是onListItemClick事件的代碼。此代碼重置可見列表項目。並正確加粗所選項目。但是,當用戶隨機滾動TextViews爲粗體時,我認爲是因爲視圖正在回收。

因此,onClick我想重置任何以前點擊的textViews和粗體單擊的項目。

我的工作不正常代碼:

@Override 
    public void onListItemClick(ListView listView, View view, int position, long id) 
    { 
     super.onListItemClick(listView, view, position, id); 

      //Tablet 
      for (int i = 0; i < adapter.getCount(); i++) 
      {     
       View mView = listView.getChildAt(i); 

       if (mView != null) 
       { 
        //Reset Bold text to default 
        TextView mtv = (TextView)mView.findViewById(R.id.Name); 
        mtv.setTypeface(null, Typeface.BOLD); 

        LinearLayout ll = (LinearLayout)mView.findViewById(R.id.itemlayout); 
        ll.setBackgroundDrawable(null); 
       } 
      }  

      TextView tv = (TextView)view.findViewById(R.id.Name); 
      tv.setTypeface(null, Typeface.NORMAL); 

      LinearLayout ll = (LinearLayout)view.findViewById(R.id.itemlayout); 
      ll.setBackgroundResource(R.drawable.dashboard_list_selector); 

    } 
} 

回答

1

會發生什麼情況是正常的,你說的回收利用舊觀點關閉屏幕,而不是建立新的。你需要做的是改變你的適配器,你需要的邏輯也必須在你的getView方法中實現。此外,您需要您的適配器支持不同類型的項目才能使用不同的背景。

看看這個example,這個例子有一個不同的目標,但它適用於你需要的解決方案。

對不起,但沒有一個快速的解決方案。讓我知道它是否有幫助。

0

正如之前指出的那樣,您遇到的問題是基於Android重用視圖來加速listview的滾動。過去我已經解決了這個問題,就是維護一個平行數組,以跟蹤項目是否應該加粗。在getView代碼中,檢查項目位置中的標誌是否爲真,否則取消標記(必須將其設置回其默認狀態)。然後當用戶點擊某個項目時切換該標誌並致電notifyDataSetChanged。這將強制重繪並粗選所選項目。