Я работаю над образцом Android-приложения с панелью инструментов со счетчиком «фильтровать новости», и я хочу использовать фильтр элементов.
Мне нужно:
Полный код доступен на GitHub, здесь. Некоторый xml-код:
activity_main.xml
[...]
<android.support.design.widget.AppBarLayout
android:id = "@+id/appbar"
android:layout_width = "match_parent"
android:layout_height = "@dimen/detail_backdrop_height"
android:fitsSystemWindows = "true"
android:theme = "@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id = "@+id/collapsing_toolbar"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true"
app:contentScrim = "?attr/colorPrimary"
app:expandedTitleMarginEnd = "64dp"
app:expandedTitleMarginStart = "48dp"
app:expandedTitleTextAppearance = "@android:color/transparent"
app:layout_scrollFlags = "scroll|exitUntilCollapsed">
<RelativeLayout
android:layout_width = "wrap_content"
android:layout_height = "wrap_content">
<ImageView
android:id = "@+id/backdrop"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true"
android:scaleType = "centerCrop"
app:layout_collapseMode = "parallax" />
<LinearLayout
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_centerInParent = "true"
android:gravity = "center_horizontal"
android:orientation = "vertical">
<TextView
android:id = "@+id/love_music"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
tools:text = "@string/backdrop_title"
android:textColor = "@android:color/white"
android:textSize = "@dimen/backdrop_title" />
<TextView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
tools:text = "@string/backdrop_subtitle"
android:textColor = "@android:color/white"
android:textSize = "@dimen/backdrop_subtitle" />
</LinearLayout>
</RelativeLayout>
<android.support.v7.widget.Toolbar
android:id = "@+id/toolbar"
android:layout_width = "match_parent"
android:layout_height = "?attr/actionBarSize"
app:layout_collapseMode = "pin"
app:popupTheme = "@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
[...]
spinner_dropdown_item.xml
<?xml version = "1.0" encoding = "utf-8"?>
<TextView xmlns:android = "http://schemas.android.com/apk/res/android"
android:id = "@android:id/text1"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:background = "@color/colorPrimary"
android:gravity = "center_vertical"
android:minHeight = "?android:attr/listPreferredItemHeightSmall"
android:paddingLeft = "12dp"
android:paddingRight = "12dp"
></TextView>
И styles.xml
<resources>
<!-- Base application theme. -->
<style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name = "colorPrimary">@color/colorPrimary</item>
<item name = "colorPrimaryDark">@color/colorPrimaryDark</item>
<item name = "colorAccent">@color/colorAccent</item>
</style>
<style name = "AppTheme.NoActionBar">
<item name = "windowActionBar">false</item>
<item name = "windowNoTitle">true</item>
</style>
<style name = "AppTheme.AppBarOverlay" parent = "ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name = "AppTheme.PopupOverlay" parent = "ThemeOverlay.AppCompat.Light" />
</resources>
Заранее спасибо.
Вам нужно создать собственный класс Java, расширяющий ArrayAdapter, и применить там логику для изменения цвета текста.
public class SpinnerAdapter extends ArrayAdapter<String> {
private Context mContext;
private List<String> mStringList;
public SpinnerAdapter(@NonNull Context context, int resource, @NonNull List<String> spinnerItems) {
super(context, resource, spinnerItems);
mContext = context;
mStringList = spinnerItems;
}
@Override
public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return spinnerView(position, convertView, parent);
}
@Override
public int getCount() {
return super.getCount();
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return spinnerView(position, convertView, parent);
}
private View spinnerView(int position, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView == null){
holder = new ViewHolder();
// Your spinner dropdown item xml here
convertView = LayoutInflater.from(mContext). inflate(R.layout.spinner_dropdown_item, parent, false);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//Custom logic here, example below
String matchDay = mStringList.get(position);
holder.mMatchday = convertView.findViewById(R.id.matchday);
holder.mDates = convertView.findViewById(R.id.spinner_dates);
holder.mMatchday.setText(matchDay);
return convertView;
}
private class ViewHolder {
private TextView mMatchday, mDates;
}
В вашей деятельности
List<String> stringList= new ArrayList<>();
for (int i = 0; i < 20; i++){
stringList.add("String " + (i + 1));
}
SpinnerAdapter dataAdapter = new SpinnerAdapter(getContext(), R.layout.format_home_spinner, stringList);
mSpinner.setAdapter(dataAdapter);
Наконец, я нашел решение: я использовал старый стиль макета для счетчика и его элемента. Изменение в объявлении счетчика MainActivity в:
...
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getApplicationContext(),
R.array.article_filter_text, R.layout.spinner_dropdown_item);
adapter.setDropDownViewResource( R.layout.spinner_dropdown_item);
...
И имея spinner_dropdown_item.xml:
<?xml version = "1.0" encoding = "utf-8"?>
<TextView xmlns:android = "http://schemas.android.com/apk/res/android"
android:id = "@android:id/text1"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:background = "@color/colorPrimary"
android:textColor = "@color/white"
android:gravity = "center_vertical"
android:minHeight = "?android:attr/listPreferredItemHeightSmall"
android:paddingLeft = "12dp"
android:paddingRight = "12dp"
></TextView>
Я получил:
А также:
Tnx за ответ, но я хочу решить его, не определяя адаптер счетчика.