listview去除item下划线

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都会修改,这种作用)

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值