Я хочу иметь строки с градиентным фоном в моем ListView, и я хочу, чтобы они менялись до сплошного цвета при нажатии. Но я не могу понять. Я знаю о проблеме ListViews, и я читал некоторые решения в других темах, но ни один из них, похоже, не работает для меня. Любая помощь будет большой.Цвет строки ListView с градиентным фоном
Когда я запускаю следующий код я получить это изображение, которое нормально:
Но когда я нажимаю по пункту 2, все строки будут зеленый !:
Вот мой адаптер:
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));
}
}
Да, я знаю, что это общее. Но это не один цвет, это указано! и две строки не могут быть нажаты в одно и то же время. – Mbt925
О, я понял. Но почему это имеет значение? Почему я должен использовать отдельную статью для каждой строки? – Mbt925
@ Mbt925 Ну, в каждой строке у вас есть свой цвет из той же 'mBackgroundDrawable'. Поэтому, если вы измените цвет 'mBackgroundDrawable', и поскольку каждая строка имеет одинаковую ссылку, все они будут иметь один и тот же цвет. Это похоже на наличие 10 хамелеонов перед одной уникальной большой стеной. Если вы перекрасите свою большую стену, каждый хамелеон изменит свой цвет. Но если вы создадите «маленькую» стену для каждого хамелеона, который у вас есть (и измените цвет нужной стены), только один хамелеон изменит цвет. :) –