2012-02-08 162 views
1

我在滾動時遇到以下問題。Android:列表滾動列表查看項目背景問題

在我的應用程序中,我有一個需要多選的列表視圖。此外,這是一個自定義列表,其中選擇需要通過更改列表項顏色而不是基於複選框的方法來表示。 爲此:在OnClick中,我檢查是否選擇了位置,然後設置該項目的背景。但是,當我滾動列表時,這有問題。舉一個例子: 假設列表中有50個項目。一次可以看到10個。我選擇說第五項[從而改變背景]。然後我滾動列表。滾動列表中與前5項對應的可見部分,例如列表中的第15個項目,而是可見部分中的第5個索引,仍然具有對應於選定狀態的背景。鑑於我還沒有選擇第15項,因此它不應該設置。

我試過了: a-在適配器的getView方法中,如果該項目不是選中的項目之一,我設置一個背景其他不同。嘗試setBackgroundColor以及setBackgrounddrawable。 b-在xml中已將cacheColorHint設置爲透明 c-將選擇器附加到項目以及響應狀態的項目[按下,選中] onlcick。

但是,我仍然無法擺脫滾動項目不需要的背景顏色。

任何幫助。我嘗試過在各個帖子中提到的各種建議,但尚未成功。

我試圖

感謝 普拉迪普

+0

您的convertView重新使用?因爲它聽起來像背景已經設置好,而且在重新使用時不會重置它。 – Blundell 2012-02-08 14:47:22

+0

同意@Blundell,你應該發佈你的適配器代碼。 – dmon 2012-02-08 14:56:55

回答

1

這是Android的ListView適配器的一種正常的行爲,它的getView()呼籲每一個滾動和每一個新的列表項調用它getView,如果當前列表視圖項在UI上不可見,那麼它的convertView等於null:在某個時間,listview只加載可見列表項,如果它每次顯示50個元素中的10個元素,那麼listView.getChildCount()將只返回10個而不是50個。 在你選擇5時,它反映了5 + 10(可見項數)= 15,25,35,45的選擇。 爲了解決這個問題,你應該有一個標誌與你的每個listItem數據關聯,例如,如果你有字符串數組itemData [50]作爲數組,然後採用布爾isSelected [50]的數組,每個初始值爲false。

看一看的getView(),在適配器類:

 public View getView(int position, View convertView, ViewGroup parent) { 

     final ViewHolder holder; 
        string text = itemData[position] 
     if (convertView == null) { 
      rowLayout = (RelativeLayout) LayoutInflater.from(context) 
        .inflate(R.layout.list_view_item, parent, false); 
      holder = new ViewHolder(); 

      holder.txtString= (TextView) rowLayout 
        .findViewById(R.id.txtTitle); 
      rowLayout.setTag(holder); 
     } else { 
      rowLayout = (RelativeLayout) convertView; 
      holder = (ViewHolder) rowLayout.getTag(); 
     } 


     if(isSelected[position] == true){ 
        holder.txtString.setText("Selected") 
        rowLayout.setBackGround(selected) 
     }else{ 
          holder.txtString.setText("Not Selected") 
      rowLayout.setBackGround(notSelected) 
     } 




    public class ViewHolder { 
     public TextView txtString; 

    } 

,並在listView.setOnItemClickListener()你的Activity類:

listView.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> arg0, View arg1, 
         int position, long arg3) { 
        // TODO Auto-generated method stub 
         isSelected[position] = true // on selection 

         RelativeLayout rowLayout = (RelativeLayout) view; 
      rowLayout.setBackGround(Selected); 


         // also set here background selected for view by getting layout refference 


        } 
      }); 
+0

在您的代碼中單擊某一行時,相對布爾值設置爲true,但在單擊另一行時,您從不將其重置爲false。這是一個錯誤嗎?如果是,我該如何解決?上面的示例中的 – 2014-09-11 13:29:14

+0

用於多行選擇,而只是一個邏輯。爲了您的需要,您可以使用Array.fill(isSelected,false);就在isSelected [position] = true之前; – 2014-09-19 07:36:54