2012-09-26 35 views
9

我知道這聽起來很簡單,並且有關於此的問題。但沒有一個可以解決我的問題。所以在這裏,我們去:更改Android中項目的背景顏色ListActivity onListItemClick

我想改變列表項的背景色在ListActivity當用戶點擊它,它變回原來的顏色,當用戶再次點擊(即選擇/取消選擇項目排序的樣子)

我試過使用getChildAt,如果我在一個屏幕中顯示所有項目而不必滾動,它可以很好地工作。

代碼:

getListView().getChildAt(position).setBackgroundColor(Color.CYAN); 

時,我有列表中的多個項目,用戶通過他們向滾動的問題開始。一旦一個項目的背景被改變,當我滾動時,背景顏色出現在新可見的項目上。此外,getChildAt(position)返回null(因此)再次點擊該項目時。

任何人都可以請幫我一個簡單的代碼,可以幫助我更改列表項的背景顏色?

在此先感謝!

+0

我覺得這個主題將幫助你做到這一點不喜歡這樣。 http://stackoverflow.com/questions/2217753/changing-background-color-of-listview-items-on-android – thiagolsilva

回答

5

當然可以。我會在自定義ListAdaptergetView()方法中執行此操作。

MyAdapter extends SimpleAdapter { 
    private ArrayList<Integer> coloredItems = new ArrayList<Integer>(); 

    public MyAdapter(...) { 
     super(...); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = super.getView(position, convertView, parent); 

     if (coloredItems.contains(position)) { 
      v.setBackgroundColor(Color.CYAN); 
     } else { 
      v.setBackgroundColor(Color.BLACK); //or whatever was original 
     } 

     return v; 
    } 
} 

更新coloredItems當單擊列表項時。

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    if (coloredItems.contains(position)) { 
     //remove position from coloredItems 
     v.setBackgroundColor(Color.BLACK); //or whatever was original 
    } else { 
     //add position to coloredItems 
     v.setBackgroundColor(Color.CYAN); 
    } 
} 
+0

太棒了!這工作非常完美!我很難找出解決方案。你的回答非常有幫助。希望我可以給你兩個投票... :)再次感謝! :) –

+0

你很受歡迎! – heycosmo

+0

經過幾個小時的死路,你向我展示了正確的道路,幹得好的男人! –

1

我所做的是創建一個名爲list_background的xml文件,並將其放入drawable文件夾中。

的XML看起來是這樣的:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@color/list_selected" android:state_pressed="true" /> 
    <item android:drawable="@android:color/white" /> 
</selector> 

而且在ListView的項目的XML代碼我把這個XML作爲項目的背景,即

item.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      style="@style/Fill" 
      android:background="@drawable/list_background"> 

    <!-- Your layout here --> 
</RelativeLayout> 

style = @ style/Fill只是我爲 製作的一個捷徑android:layout_height =「match_parent」and android:layout_width =「match_parent

然後在onListItemCLick:

public void onListItemClick(ListView l, View v, int position, long id) { 
    v.setPressed(!v.isPressed) //Toggle between colors of the view 
} 
+0

感謝您的幫助!但是這個解決方案有兩個問題: 1)一次只能選擇一個項目,如果你嘗試選擇另一個項目,第一個項目會自動丟失它的背景顏色。 2)如果您選擇一個項目,向下滾動然後向上滾動,您看到的是所選項目現在沒有背景色! :( 請幫忙,謝謝! –

+2

是的,你需要修改你的ListAdapter的getView方法來保持這個狀態(見下面的答案)因爲ListView會重用項目視圖,一個出現在頂部的項目一個滾動條)可以從一個項目繼承特性,除非這些特性在'getView'中重置。 – heycosmo

+0

@heycosmo:如果我不使用自己的ListAdapter會怎樣?因爲我使用的是SimpleAdapter。我該如何解決這個問題? –

0

我這是怎麼做的:

創建一個全局變量View ColoredView;那麼當你setOnItemClickListenerListView,這樣做:

MenuList.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       if (ColoredView != null) 
        ColoredView.setBackgroundColor(Color.WHITE); //original color 

       view.setBackgroundColor(Color.BLUE); //selected color 
       ColoredView = view; 
      } 
     }); 

這是在我看來,最簡單的方法。

2

如果您正在使用ListFragment處理那麼這段代碼會有所幫助,

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     if (view != null) { 
      getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
      getListView().setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS); 
      catagoryValueListView=getListView(); 
      catagoryValueListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       if (ColoredView != null) 
        ColoredView.setBackgroundColor(Color.WHITE); //original color 

       view.setBackgroundColor(Color.BLUE); //selected color 
       ColoredView = view; 
            } 
     }); 
    } 

} 
+0

請更新您的答案,並在代碼標籤內通過代碼。 –

0

感謝heycosmo。你的解決方案解決了我的問

不知道爲什麼我們應該在2個地方設置背景。

1.適配器的getView()

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    .... 
    .... 
    .... 
     if(arrayBools[position]) { 
      view.setBackgroundColor(Common.colorBkgroundSelected); 
     } 
     else{ 
      view.setBackgroundColor(Common.colorBkgroundNormal);    
     } 
    .... 
    .... 
    .... 
} 

2. ListActivity的onListItemClick()。

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id);  
     arrayBools[position] = (arrayBools[position] ? false : true); 

    if(arrayBools[position]) { 
     v.setBackgroundColor(colorBkgroundSelected); 
    } 
    else{ 
     v.setBackgroundColor(colorBkgroundNormal);   
    }  
} 
1

只要你能在onListItemClick方法

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    for (int a = 0; a < l.getChildCount(); a++) { 
     l.getChildAt(a).setBackgroundColor(Color.TRANSPARENT); 
    } 

    ColorDrawable colorDrawable1 = new ColorDrawable(
      Color.parseColor("#A0A3A0")); 
    v.setBackgroundDrawable(colorDrawable1); 

    if (position == 0) { 
     Intent i = new Intent(MainActivity.this, NewActivity.class); 

     startActivity(i); 
    } 

} 
相關問題