Android自定义条目item优化布局

前言


最近项目轻松了些,也有时间静下心来优化代码了,看着有些布局近千行,我看着也是醉了,于是下决心优化下,程序猿要行动起来,不要说,这是以后我对自己的要求吧,与君共勉!


自定义条目步骤


不多说,先从最常见的布局抓起,比如常见的设置界面,很多相似的条目其实可以抽出来,一般是LinearLayout上TextView+imageView,或者是ImageView+TextView等等

好了,直接上代码吧,原理也都是android的自定义View,自定义属性集

1.自定义属性集

<declare-styleable name="ATSettingItem">
    <attr name="item_icon" format="reference|color" />
    <attr name="item_label_name" format="string" />
    <attr name="is_show_right_text" format="boolean" />
    <attr name="is_show_divider" format="boolean" />
    <attr name="is_show_item_icon" format="boolean" />
    <attr name="item_height" format="dimension" />
    <attr name="item_right_label_name" format="string" />
    <attr name="item_padding_left" format="dimension" />
    <attr name="item_padding_right" format="dimension" />
    <attr name="item_text_color" format="reference|color" />
    <attr name="item_backgroud" format="reference|color" />
</declare-styleable>

2.继承自线性布局LinearLayout

package com.asiatravel.asiatravel.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.asiatravel.asiatravel.R;

/**
 * A widget for the same item
 * use in xml
 * use in code
 * Created by MrBoudar on 16/6/7.
 */
public class ATSettingItem extends LinearLayout {
    private View itemView;
    private View dividerView;
    private LinearLayout itemParentLayout;
    private ImageView itemIconIv;
    private TextView itemLabelTv;
    private TextView itemRightLabelTv;
    private ImageView itemVersionUpgrade;
    private int itemIcon;
    private int itemHeight;
    private int itemPaddingLeft;
    private int itemPaddingRight;
    private String itemLabelName;
    private String itemRightLabelName;
    private boolean isShowRightText;
    private boolean isShowDivider;
    private boolean isShowItemIcon;
    private ATItemChangeListener mItemChangeListener;

    public ATSettingItem(Context context) {
        this(context, null);
    }

    public ATSettingItem(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ATSettingItem(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    public void init(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ATSettingItem);
        itemIcon = typedArray.getResourceId(R.styleable.ATSettingItem_item_icon, R.drawable.iv_commom_data);
        itemLabelName = typedArray.getString(R.styleable.ATSettingItem_item_label_name);
        itemHeight = typedArray.getDimensionPixelSize(R.styleable.ATSettingItem_item_height, context.getResources().getDimensionPixelSize(R.dimen.dimens_44_dp));
        itemPaddingLeft = typedArray.getDimensionPixelSize(R.styleable.ATSettingItem_item_padding_left, context.getResources().getDimensionPixelSize(R.dimen.dimens_14_dp));
        itemPaddingRight = typedArray.getDimensionPixelSize(R.styleable.ATSettingItem_item_padding_right, context.getResources().getDimensionPixelSize(R.dimen.dimens_14_dp));
        isShowRightText = typedArray.getBoolean(R.styleable.ATSettingItem_is_show_right_text, false);
        isShowDivider = typedArray.getBoolean(R.styleable.ATSettingItem_is_show_divider, false);
        isShowItemIcon = typedArray.getBoolean(R.styleable.ATSettingItem_is_show_item_icon, true);
        if (isShowRightText) {
            itemRightLabelName = typedArray.getString(R.styleable.ATSettingItem_item_right_label_name);
        }
        initView(context);
        initData();
        typedArray.recycle();
    }

    public void initView(Context context) {
        if (itemView == null) {
            itemView = LayoutInflater.from(context).inflate(R.layout.at_setting_item, this);
        }
        itemParentLayout = (LinearLayout) itemView.findViewById(R.id.item_parent_layout);
        itemIconIv = (ImageView) itemView.findViewById(R.id.item_icon_imageview);
        itemLabelTv = (TextView) itemView.findViewById(R.id.item_label_textview);
        itemRightLabelTv = (TextView) itemView.findViewById(R.id.item_right_label_textview);
        dividerView = itemView.findViewById(R.id.item_divider);
        itemVersionUpgrade = (ImageView) itemView.findViewById(R.id.item_version_update);
    }

    public void initData() {
        itemParentLayout.setLayoutParams(generateLayoutParams());
        this.setPadding(itemPaddingLeft, 0, itemPaddingRight, 0);
        itemIconIv.setImageResource(itemIcon);
        itemLabelTv.setText(itemLabelName);
        if (isShowItemIcon) {
            itemIconIv.setVisibility(View.VISIBLE);
        }
        if (isShowRightText) {
            itemRightLabelTv.setVisibility(View.VISIBLE);
            itemRightLabelTv.setText(itemRightLabelName);
        }
        if (isShowDivider) {
            dividerView.setVisibility(View.VISIBLE);
        }
    }

    public void setItemLabelName(String name) {
        if (null != itemLabelTv) {
            itemLabelTv.setText(name);
        }
    }

    public void setItemIcon(int iconResId) {
        if (null != itemIconIv) {
            itemIconIv.setImageResource(iconResId);
        }
    }

    public void showUpgradeIcon() {
        if (null != itemVersionUpgrade) {
            itemVersionUpgrade.setVisibility(View.VISIBLE);
        }
    }

    /**
     * Add item in code
     *
     * @param mainContainer
     */
    public void addItem(LinearLayout mainContainer) {
        mainContainer.addView(this);
    }

    public void setIsShowRightText(boolean isShowRightText) {
        this.isShowRightText = isShowRightText;
    }

    public void setItemRightLabelName(String rightLabelName) {
        if (null != itemRightLabelTv && this.isShowRightText) {
            itemRightLabelTv.setVisibility(View.VISIBLE);
            itemRightLabelTv.setText(rightLabelName);
        }
    }

    public LayoutParams generateLayoutParams() {
        return new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, itemHeight);
    }

    /**
     * interface for outer to use this widget
     */
    public interface ATItemChangeListener {
        public void setItemLabel();

        public void setItemRightLabel();

        public void setItemIcon();
    }

    public void setAtItemChangeListener(ATItemChangeListener atItemChangeListener) {
        this.mItemChangeListener = atItemChangeListener;
    }
}
3.代码基本就是这样,原理就是使用android自定义的属性集,其实可以看看android TextView的实现,一个完美的自定义View首先可以引入到XML,可以动态的添加条目,就类似web上动态表单,根据动态添加需要的条目,可根据需求定义不同类型,展示不同的条目到前端。

总结:实现思路就是这样,多学多练吧,我觉得提升最快的就是自己要写一遍,加深理解,向大神们多学习!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值