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

时间:2015-07-21 18:11:56

标签: android listview android-arrayadapter android-theme appcompat-v7-r22.1

我有三个片段的minidemo。一个显示直接显示两个TextView和一个editview,下一个显示与使用自定义适配器的列表中的行相同的布局,第三个显示带有标准适配器的简单列表(simple_list_item_1)

活动使用标准主题(Theme.AppCompat.Light.DarkActionBar),我没有修改过。

我原本预计所有三个街区的样式都是类似的。相反,具有自定义适配器的第二个块似乎根本不会根据灯光主题进行样式设置。 (见本文末尾的截图)

理想,我喜欢自定义列表的行,就像第一个块一样。或者,我想要应用第三个块的样式。然而,所有的字体和背景似乎都是一些颜色,我不知道如何找出当前用作主题的一部分。因此,通过手动分配文本颜色,大小,背景等来修复中间块的样式不是一种选择。

有关整个演示,请参阅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>

自定义片段。同样,完整版本位于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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

Arghh,我刚从Use android.R.layout.simple_list_item_1 with a light theme

的提示找到了答案

诀窍是删除getActivityContext()并在创建适配器时直接传入活动对象。悲伤但有效。

相关问题