android - 使用自定义适配器时,ListView 不会使用主题设置样式

标签 android listview android-arrayadapter android-theme android-appcompat

我有包含三个 fragment 的迷你演示。一个直接显示两个 TextView 和一个 editview,下一个将相同的布局视为带有自定义适配器的列表中的行,第三个显示带有标准适配器的普通列表 (simple_list_item_1)

该 Activity 使用标准主题 (Theme.AppCompat.Light.DarkActionBar),我没有对其进行修改。

我原以为所有三个 block 的样式都相似。相反,带有自定义适配器的第二个 block 似乎根本没有根据浅色主题设置样式。 (见本文末尾的截图)

理想情况下,我希望自定义列表的行的样式像第一个 block 一样。或者,我想应用第三个 block 的样式。然而,所有的字体和背景似乎都有些颜色不对,我不确定如何找出当前用作主题一部分的内容。因此,通过手动分配文本颜色、大小、背景等来固定中间 block 的样式不是一种选择。

整个demo请引用MiniDemo

这是 item_row.xml 布局文件(顶级相对布局标签似乎被编辑器剥离。完整布局请转到 gitlab )

<TextView android:text="large"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:textAppearanceLarge"
    android:id="@+id/text1_field" />

<TextView android:text="large inverse"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/text2_field"
    android:textAppearance="?android:attr/textAppearanceLargeInverse"
    android:layout_centerHorizontal="true" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="5"
    android:id="@+id/edit_field"
    android:layout_alignParentRight="true" />
</RelativeLayout>

自定义 fragment 。同样,完整版在 gitlab

public class CustomItemFragment extends ListFragment {
String[] DATA = new String[] {"foo1", "foo2", "foo3"};

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ItemAdapter adapter = new ItemAdapter(this.getActivity().getApplicationContext(), DATA);
    setListAdapter(adapter);
}

}`

适配器(gitlab):

public class ItemAdapter extends BaseAdapter {
private static final String TAG = ItemAdapter.class.getSimpleName();

private final Context mContext;
private final String[] mData;

public ItemAdapter(Context mContext, String[] data) {
    this.mContext = mContext;
    this.mData = data;
}

@Override
public int getCount() {
    return mData.length;
}

@Override
public Object getItem(int position) {
    return mData[position];
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) LayoutInflater.from(mContext);
    View rowView = inflater.inflate(R.layout.item_row, parent, false);

    TextView text1View = (TextView) rowView.findViewById(R.id.text1_field);
    TextView text2View = (TextView) rowView.findViewById(R.id.text2_field);
    EditText editText = (EditText) rowView.findViewById(R.id.edit_field);

    text1View.setText(mData[position]);
    text2View.setText(mData[position]);
    editText.setText(Integer.toString(position));

    return rowView;
}

然后,这是一个演示效果的截图。

enter image description here

最佳答案

不使用 getApplicationContext(),而是使用 getBaseContext()getContext()

更多信息:Theme/Style is not applied when inflater used with ApplicationContext

关于android - 使用自定义适配器时,ListView 不会使用主题设置样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31546585/

相关文章:

java - LisrView 子项的不同颜色

android - 从 sqlite 中删除项目后 RecyclerView 不更新?

java - 我不明白Android AutoCompleteTextView ArrayAdapter的构造函数

Android 在一个结果中自动完成多个 textview 行

android - 在 ArrayAdapter 的 getView() 方法中只下载一次图像

Android Maps V2 内存泄漏 LocationClientHelper

android - 如何在 android 源代码中添加 Android Studio 创建的应用程序?

java - 是否从 MainActivity 和 fragment 复制线程启动服务?

android - 如何在Android中使用Phonegap实现 "one time login"?

java - 当我按后退按钮时,如何阻止 ListView 再次加载?