listview去除item下划线的方式
前言
在Android开发中,listview是一个比较常见的展示数据的控件。正因为是android内部封装好的控件,要想修改其中style变成自己自定义的就比较困难。这里举例去除item的下划线,修改其他的style属性,参考一下就好。正所谓举一反三,一力降十会就是这样。
PS:要想更自由的修改控件style,一定要拉去AOSP源码,阅读源码一目了然
ListView源码style获取
//这些是Listview的构造函数,通过参数列表,我们可以知道,在创建listiew的时候,会传递style参数。attr就位于values/attrs.xml的文件中的参数
public ListView(Context context) {
this(context, null);
}
public ListView(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.listViewStyle);
}
public ListView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public ListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.ListView, defStyleAttr, defStyleRes);
saveAttributeDataForStyleable(context, R.styleable.ListView,
attrs, a, defStyleAttr, defStyleRes);
final CharSequence[] entries = a.getTextArray(R.styleable.ListView_entries);
if (entries != null) {
setAdapter(new ArrayAdapter<>(context, R.layout.simple_list_item_1, entries));
}
//特别注意这一行ListView_divider,这里说明divider是定义在attr中的drawable类型参数。
final Drawable d = a.getDrawable(R.styleable.ListView_divider);
if (d != null) {
// Use an implicit divider height which may be explicitly
// overridden by android:dividerHeight further down.
setDivider(d);
}
final Drawable osHeader = a.getDrawable(R.styleable.ListView_overScrollHeader);
if (osHeader != null) {
setOverscrollHeader(osHeader);
}
final Drawable osFooter = a.getDrawable(R.styleable.ListView_overScrollFooter);
if (osFooter != null) {
setOverscrollFooter(osFooter);
}
// Use an explicit divider height, if specified.
if (a.hasValueOrEmpty(R.styleable.ListView_dividerHeight)) {
final int dividerHeight = a.getDimensionPixelSize(
R.styleable.ListView_dividerHeight, 0);
if (dividerHeight != 0) {
setDividerHeight(dividerHeight);
}
}
mHeaderDividersEnabled = a.getBoolean(R.styleable.ListView_headerDividersEnabled, true);
mFooterDividersEnabled = a.getBoolean(R.styleable.ListView_footerDividersEnabled, true);
a.recycle();
}
找到ListView_divider有关的东西,我们开始去翻对应定义在style中参数。一般来说,theme不同的化,里面定义的参数也是不同。所以要具体类型具体分析,万变不离其宗好吧。
我这里用到的是:style/Theme.Material.Light 这个theme参数。
之后,我们就要去找个参数是怎么样定义的。
在/frameworks/base/core/res/res/values/themes.xml文件中,我们可以找到有关定义如下:
<style name="Theme.Material.Light" parent="Theme.Light">
<!--找关于listview相关的style参数-->
<!-- Widget styles -->
<item name="listViewStyle">@style/Widget.Material.Light.ListView</item>
<!--这里看到赋予是Widget.Material.Light.ListView,去style文件中找这个值-->
<style name="Widget.Material.Light.ListView" parent="Widget.Material.ListView"/>
<!--这里我们找到想要的divider了,可以看到是定义在attrs文件中-->
<style name="Widget.Material.ListView" parent="Widget.ListView">
<item name="divider">?attr/listDivider</item>
<item name="listSelector">?attr/listChoiceBackgroundIndicator</item>
</style>
删除下划线
所以在项目的style文件中,我们这样设置
<style name="appThme" parent="Theme.Material.Light">
<item name="android:listViewStyle">@style/CustomListViewstyle</item>
</style>
<style name="CustomListViewstyle" parent="@andtoid:style/Widget.Material.Light.ListView">
<item name="android:divider">@null</item>
</style>
这样就可以了。
总结
算上上一次修改二级菜单样式,这一片算上对这种修改方式的一种巩固复习。下次遇见这类需求的时候,就不会没有思路了。此外,网上还有直接在xml中修改的方式,但是那种方式都比较浅,就是可改动的范围不大或者作为开发者看不见这些存在的改动,因为被良好的封装了。所以个人认为还是这种在style文件下的修改还是比较好的,而且适用强(比如所有的listview都会修改,这种作用)