2015-03-05 6 views
-1

Я хочу иметь строки с градиентным фоном в моем ListView, и я хочу, чтобы они менялись до сплошного цвета при нажатии. Но я не могу понять. Я знаю о проблеме ListViews, и я читал некоторые решения в других темах, но ни один из них, похоже, не работает для меня. Любая помощь будет большой.Цвет строки ListView с градиентным фоном

Когда я запускаю следующий код я получить это изображение, которое нормально: Before pressed

Но когда я нажимаю по пункту 2, все строки будут зеленый !: after pressed

Вот мой адаптер:

public class MyAdapter extends BaseAdapter { 

    private final Context mContext; 
    private ArrayList<String> mMenuItems; 

    StateListDrawable mBackgroundDrawable; 

    public MyAdapter(Context context) { 

     this.mContext = context; 

     mMenuItems= new ArrayList<>(); 
     for (int i = 0; i < 10; i++) { 
      mMenuItems.add(String.format("Item %d", i)); 
     } 

     // make background drawable 
     GradientDrawable backgroundDrawable = new GradientDrawable(
       GradientDrawable.Orientation.TOP_BOTTOM, 
       new int[]{ Color.RED, Color.YELLOW, Color.RED}); 
     backgroundDrawable.setCornerRadius(0f); 

     ColorDrawable selectedColorDrawable= new ColorDrawable(Color.GREEN); 

     mBackgroundDrawable = new StateListDrawable(); 
     mBackgroundDrawable.addState(new int[] {android.R.attr.state_pressed}, selectedColorDrawable); 
     mBackgroundDrawable.addState(new int[] {android.R.attr.state_focused}, selectedColorDrawable); 
     mBackgroundDrawable.addState(new int[] {android.R.attr.state_selected}, selectedColorDrawable); 
     mBackgroundDrawable.addState(new int[] {}, backgroundDrawable); 
    } 

    @Override 
    public int getCount() { 
     return mMenuItems.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mMenuItems.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewGroup item = getViewGroup(convertView); 
     if (Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN) { 
      item.setBackgroundDrawable(mBackgroundDrawable); 
     } else { 
      item.setBackground(mBackgroundDrawable); 
     } 
     // set title 
     TextView titleView= (TextView) item.findViewById(R.id.menu_title); 
     titleView.setText(mMenuItems.get(position)); 
     return item; 
    } 

    public ViewGroup getViewGroup(View reuse) 
    { 
     if(reuse instanceof ViewGroup) 
      return (ViewGroup)reuse; 

     LayoutInflater inflater = LayoutInflater.from(mContext); 
     ViewGroup item = (ViewGroup)inflater.inflate(R.layout.row_menu, null); 

     return item; 
    } 
} 

Мой row_menu.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="5dp"> 

    <TextView 
     android:id="@+id/menu_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true"/> 

</RelativeLayout> 
макет

Моя активность в:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:padding="10dp"> 

    <ListView 
     android:id="@+id/activity_main_listview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</LinearLayout> 

Моя активность:

public class MainActivity extends ActionBarActivity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ListView list = (ListView) findViewById(R.id.activity_main_listview); 
     list.setAdapter(new MyAdapter(this)); 
    } 
} 

ответ

1

mBackgroundDrawable является общим для всех строк. Вам нужно прикрепить к каждой строке уникальный mBackgroundDrawable (например, внутри вашего цикла, где вы его добавляете). Это довольно просто, но не стесняйтесь спрашивать, нужен ли вам конкретный пример! ;)

+0

Да, я знаю, что это общее. Но это не один цвет, это указано! и две строки не могут быть нажаты в одно и то же время. – Mbt925

+0

О, я понял. Но почему это имеет значение? Почему я должен использовать отдельную статью для каждой строки? – Mbt925

+1

@ Mbt925 Ну, в каждой строке у вас есть свой цвет из той же 'mBackgroundDrawable'. Поэтому, если вы измените цвет 'mBackgroundDrawable', и поскольку каждая строка имеет одинаковую ссылку, все они будут иметь один и тот же цвет. Это похоже на наличие 10 хамелеонов перед одной уникальной большой стеной. Если вы перекрасите свою большую стену, каждый хамелеон изменит свой цвет. Но если вы создадите «маленькую» стену для каждого хамелеона, который у вас есть (и измените цвет нужной стены), только один хамелеон изменит цвет. :) –

1

Вы можете достичь этого через свой XML.

ListView

<ListView 
     android:id="@+id/list_slidermenu" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@color/list_divider" 
     android:dividerHeight="1dp"  
     android:listSelector="@drawable/list_selector" 
     android:background="@color/list_background"/> 

вводимого коэффициента/list_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:drawable="@drawable/list_item_bg_normal" android:state_activated="false"/> 
    <item android:drawable="@drawable/list_item_bg_pressed" android:state_pressed="true"/> 
    <item android:drawable="@drawable/list_item_bg_pressed" android:state_activated="true"/> 

</selector> 

вводимого коэффициента/list_item_bg_pressed.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient 
     android:startColor="@color/list_background_pressed" 
     android:endColor="@color/list_background_pressed" 
     android:angle="90" /> 
</shape> 

вводимого коэффициента/list_item_bg_normal.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient 
     android:startColor="@color/list_background" 
     android:endColor="@color/list_background" 
     android:angle="90" /> 
</shape> 

Как вы видите, в ListView есть атр с именем android: listSelector, и это значение «@ drawable/list_selector». Здесь мы устанавливаем селектор. , и я думаю, что остальное самопознание.

Если вам нужно больше разъяснений, прочитать http://javatechig.com/android/android-listview-tutorial

+0

Я знаю о listSelector, но я должен делать это программно. – Mbt925

+0

Другое дело, что в вашем подходе нормальный цвет фона не будет применяться ко всем строкам, только выбранная строка – Mbt925

Смежные вопросы