2012-10-17 11 views
8

Chcę mieć listę z różnymi dzielnikami między elementami listy. Użyłem tego kodu, aby określić białą rozdzielacz z wysokości 1:Ustawianie różnych kolorów rozdzielacza dla każdego elementu w widoku listy

_listView.setDivider(new ColorDrawable(Color.WHITE)); 
_listView.setDividerHeight(1); 

Jednak ustawia rozdzielacz dla wszystkich elementu być białe, a ja chcę tylko niektóre z nich być biała, a druga w inny kolor.

Jak mogę to zrobić?

+1

Próbujesz naprzemiennych barwach, lub zdefiniować różne kolorowe przekładki z różne punkty? – nickhar

+0

Próbuję zdefiniować różne kolory rozdzielacza dla różnych elementów w zależności od zawartości. Próbuję zrobić to programowo, kiedy tworzę listę, ale kiedy definiuję inny kolor, zmienia on wszystkie dzielniki na ten kolor, a nie tylko dzielnik konkretnego elementu, który chciałem zmienić. – MrBug

Odpowiedz

9

Ustaw dzielnik na wysokość na 0 i zaimplementuj Widok w układzie przedmiotu o wysokości 1 i zmieniaj jego kolor na podstawie elementu listy za każdym razem, gdy widok jest zbudowany.

Oto przykładowy układ XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/text" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

    <View 
     android:id="@+id/divider" 
    android:layout_width="fill_parent" 
    android:layout_height="1dp" 
    android:background="#FFFFFFFF" /> 

</LinearLayout> 

A to, w jaki sposób zmienić kolor w adapterze:

public class MyAdapter extends BaseAdapter { 
    /** List of items to show */ 
    private ArrayList<String> items = new ArrayList<String>(); 
    private Context context; 
    private int color[]; 

    public OffersAdapter(Context c, ArrayList<String> items, int color[]) 
    { 
     super(); 
     this.context = c; 
     this.items = items; 
     this.color = color; 
    } 

    public int getCount() { 
     return items.size(); 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder viewHolder; 

    if(null == convertView) 
    { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     convertView = inflater.inflate(R.layout.list_item, parent, false); 

     viewHolder.text = (TextView) convertView.findViewById(R.id.text); 
     viewHolder.divider = (View) convertView.findViewById(R.id.divider); 

     convertView.setTag(viewHolder); 
    } else { 
     //Retrieve the current view 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    //This is where you chance the divider color based on the item 
    viewHolder.divider.setBackgroundColor(color[position]); 

    viewHolder.text.setText(items.get(position)); 

    return convertView; 
} 

//Holds the current view 
private static class ViewHolder { 
     public TextView text; 
     public View divider; 
    } 
} 

Gdzie int color[] jest lista kolorów, które chcesz użyć.

Więcej o ViewHolder read here.

+0

próbowałem tego. ale po naciśnięciu na element i przytrzymaniu zobaczysz kolor tła, który nie jest we właściwej pozycji, pokryje utworzony widok. – MrBug

+0

Zamieść swój kod. Czy ustawiłeś wysokość? – slybloty

+0

Tak, zrobiłem ... _listView.setDivider (nowy ColorDrawable (Color.WHITE)); _listView.setDividerHeight (1); – MrBug

1
  1. Osobny przedmiot lista i cała lista w xml
  2. Tworzenie adaptera niestandardowego dla elementów listy i wystąpienia listę
  3. W zależności od kryteriów, które chcesz zmienić kolor dzielnik dla każda nowa pozycja dodasz z adapterem do listy

Przykład:

listitem.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/sometext" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

    <View 
     android:id="@+id/customdivider" 
    android:layout_width="fill_parent" 
    android:layout_height="1dp" 
      /> 

</LinearLayout> 

list.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 

    <ListView 
     android:id="@+id/totallynewlist" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     /> 

</LinearLayout> 

CustomAdapter.java

public class CustomAdapter extends BaseAdapter { 

    private Activity activity; 
    private ArrayList<HashMap<String, String>> data; 
    private static LayoutInflater inflater = null; 

    public SubjectListAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
     activity = a; 
     data = d; 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 



     public View getView(int position, View convertView, ViewGroup parent) { 
      View vi = convertView; 
      if (convertView == null) 
       vi = inflater.inflate(R.layout.listitem, null); 

     //Find the divider here and depending on your criteria change the colour - if required take data from main activity if you need it to change the colour 
     View divider= (View) vi.findViewById(R.id.customdivider); 
     if(your criteria) 
      divider.setBackgroundColor(R.color.white); //assuming white is defined in    colors 
     else 
     set to whatever color 
     return vi; 
     } 
} 

W Twojej aktywności

ListView list = (ListView) findViewById(R.id.totallynewlist); 

    // creating new HashMap 
    HashMap<String, String> map = new HashMap<String, String>(); 
    <//Pass whatever condition you want for your criteria here if you need to - optional> 
    ListPass.add(map); 

    adapter = new CustomAdapter(this, ListPass); 

    list.setAdapter(adapter); 
+0

, ale która metoda zmienia dzielnik tylko dla określonego elementu? metoda setDivider zmienia kolor dzielnika dla wszystkich elementów. – MrBug

+0

To w zasadzie nie używa dzielnika zestawu - tworzy widok 1 dp, który można zmienić kolor dla każdego elementu listy w zależności od kryteriów. Zmień tło przekroju widoku na dowolny kolor, który potrzebujesz – Slartibartfast

+0

Teraz zmieniamy go dla każdego wiersza listy, więc nie używaj dzielnika list - to jest metoda listy i dotyczy całej listy – Slartibartfast

Powiązane problemy