2019July17_列表选中效果

DailyWorkSummary

一 需求

选中列表项,当前项有选中效果;选择其他项,已选择项恢复原先效果

二 效果图

在这里插入图片描述

三 原理

View的LayoutParam使用
注意获取View大小的时机

四 注意

  • Activity加载:onCreat进入 - setContentView- View的构造-onContentChange-onCreate出去-onResume-View的onSizeChanged
  • 在Activity的onCreate或onContentChange中请求或获取数据,最好放到View.post中去,这样代码执行在onResume之后,保证View已经加载了

五 主要代码

SelectedView

public class SelectedView extends LinearLayout {
    //保留可以滑动的拓展
    public int ITEM_WRAP = 0;
    private int mHeight, mWidth;
    private int mSelectedExpand = 10;
    private int mSelectedShader = 5;

    private int mHorizontalPadding = 10;
    private int mItemWidth;
    private List<Item> mList;
    public int mSeleted = -1;

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

    public SelectedView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SelectedView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setOrientation(HORIZONTAL);
        setGravity(Gravity.CENTER);
        setBackgroundColor(Color.GREEN);
        mSelectedExpand = UtilsDensity.dip2px(3);
        mSelectedShader = UtilsDensity.dip2px(3);
        mItemWidth = UtilsDensity.dip2px(60);

    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mHeight = getHeight();
        mWidth = getWidth();
    }

    public void setItems(final List<Item> list) {

        if (list == null || list.isEmpty()) {
            removeAllViews();
            return;
        }
        mList = list;
        removeAllViews();
        getView(list);
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.setTag(i);
            child.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = (int) v.getTag();
                    int itemW;
                    View child;
                    if (switchSelected(pos)) {
                        for (int j = 0; j < mList.size(); j++) {
                            itemW = list.get(j).isSlected ? (mItemWidth + 2 * mSelectedExpand + 2 * mSelectedShader) : mItemWidth;
                            child = getChildAt(j);
                            LinearLayout.LayoutParams params = (LayoutParams) child.getLayoutParams();
                            params.width = itemW;
                            params.height = itemW;
                            params.rightMargin = 0;
                            params.leftMargin = 0;
                            int padding = mSelectedExpand + mSelectedShader;
                            if (j != mSeleted) {
                                if (j == 0) {
                                    params.rightMargin = padding;
                                } else if (j == list.size() - 1) {
                                    params.leftMargin = padding;
                                } else {
                                    params.rightMargin = padding;
                                    params.leftMargin = padding;
                                }
                            }
                            child.setLayoutParams(params);
                        }
                    }

                }
            });
        }
    }


    private boolean switchSelected(int pos) {
        if (mList == null || mList.isEmpty() || pos >= mList.size()) {
            return false;
        }
        boolean reusult = false;
        for (int i = 0; i < mList.size(); i++) {
            if (i == pos) {
                if (!mList.get(i).isSlected) {
                    mSeleted = i;
                    mList.get(i).isSlected = true;
                    reusult = true;
                }
            } else {
                mList.get(i).isSlected = false;
            }
        }

        return reusult;
    }


    private void getView(List<Item> list) {

        int itemW;
        for (int i = 0; i < list.size(); i++) {
            View itemView = getItemView();
            if (list.get(i).isSlected) {
                mSeleted = i;
            }
            itemW = list.get(i).isSlected ? (mItemWidth + 2 * mSelectedExpand + 2 * mSelectedShader) : mItemWidth;
            LayoutParams params = new LayoutParams(itemW, itemW);
            int padding = mSelectedExpand + mSelectedShader;
            if (i != mSeleted) {
                if (i == 0) {
                    params.rightMargin = padding;
                } else if (i == list.size() - 1) {
                    params.leftMargin = padding;
                } else {
                    params.rightMargin = padding;
                    params.leftMargin = padding;
                }
            }
            addView(itemView, params);
        }


    }

    public View getItemView() {
        View view = View.inflate(getContext(), R.layout.layout_select_view_item, null);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            view.setId(View.generateViewId());
        }
        return view;
    }


    public static class Item {
        public boolean isSlected = false;

        @Override
        public boolean equals(Object obj) {
            return super.equals(obj);
        }
    }
}

使用

public class SelectedViewActivity extends FragmentActivity {


    SelectedView sv;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.select_view_activity);
    }

    @Override
    public void onContentChanged() {
        super.onContentChanged();
        sv =findViewById(R.id.sv);
        sv.post(new Runnable() {
            @Override
            public void run() {
                List<SelectedView.Item> list = new ArrayList<>();
                for (int i = 0; i < 5; i++) {
                    SelectedView.Item item = new SelectedView.Item();
                    if (i == 2) {
                        item.isSlected = true;
                    }
                    list.add(item);
                }
                sv.setItems(list);
            }
        });
    }


}

六 Demo

SelectedViewActivity

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值