RecyclerView打造一个密码面板
来源:互联网 发布:eclipse java界面设计 编辑:程序博客网 时间:2024/06/13 10:42
1、效果图及思路
回删键素材
- 1、使用GridLayout的布局管理器,变为12宫格
- 2、每个item是两个textview,一大一下
- 3、下面三个需要一些特殊处理,这个Recyclerview的Adapter代码吧
- 4、分割线–使用鸿洋大神的分割线代码Android RecyclerView 使用完全解析 体验艺术般的控件
- 5、悬浮效果–这个我直接将控件包在cardview中了,因为很好控件能做到阴影效果
2、实现步骤
添加依赖:
compile 'com.android.support:design:25.3.1' compile 'com.android.support:cardview-v7:25.3.1'
values:
<color name="num_bg">#d1d5db</color> <dimen name="num_item_magin_top">7dp</dimen> R.mipmap.num_back//这个你自己去找吧,上面有素材 <dimen name="back_num_item_magin_top">18sp</dimen> <color name="diver_color">#CCCCCC</color>
2.1Recyclerview
<android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:elevation="8dp" app:cardElevation="8dp"> <android.support.v7.widget.RecyclerView android:id="@+id/num_panel" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.v7.widget.CardView>
2.2item布局
num_item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/num_item_layout" android:orientation="vertical"> <TextView android:id="@+id/num_item" android:layout_width="wrap_content" android:layout_height="33dp" android:layout_gravity="center" android:textSize="30sp" android:text="2" /> <TextView android:id="@+id/letter_item" android:layout_width="wrap_content" android:layout_height="17dp" android:layout_gravity="center" android:layout_marginBottom="2dp" android:text="abc" android:textSize="10sp" /></LinearLayout>
item布局的两个textview,上面一个太高了,下面一个太矮了,所以我用了确定的高度。
2.3Adapter数据适配器
bean
public class NumItem { private String num; private String letter; //getter、setter、toString()方法省略}
onBindViewHolder的几个if语句就是设置位置的,因为这几个在中间位置
import android.content.Context;import android.graphics.drawable.Drawable;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import java.util.List;import xxhui.space.newsclient.Bean.NumItem;import xxhui.space.newsclient.R;/** * Created by hui on 2017/7/7. */public class NumItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final String TAG = "NumItemAdapter"; private List<NumItem> data;//textview的显示的字符串数据 private OnItemClickListener clickListener;//给RecyclerView添加点击事件 private Context context; public NumItemAdapter(List<NumItem> data, Context context) { this.data = data; this.context = context.getApplicationContext(); }//初始化时注入数据 public void setOnItemClickListener(OnItemClickListener itemClickListener) {//设置注入item点击监听 clickListener = itemClickListener; } /** * 解析布局,并注入到viewHolder * * @return 给下一步提供一个ViewHolder */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.num_item, parent, false); return new ViewHolder(v); } /** * 给ViewHolder里面的控件绑定数据 * * @param holder * @param position */ //犹豫给定图片没有数据格式,默认设置为ic_launcher @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (data != null && data.size() >= position) { NumItem item = data.get(position); ViewHolder itemHolder = ((ViewHolder) holder); itemHolder.num.setText(data.get(position).getNum()); itemHolder.letter.setText(data.get(position).getLetter()); if(position==9){ itemHolder.view.setBackgroundResource(R.color.num_bg); } if(position==10){ ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams)itemHolder.num.getLayoutParams(); //<dimen name="num_item_magin_top">7dp</dimen> marginLayoutParams.topMargin = (int) context.getResources().getDimension(R.dimen.num_item_magin_top); itemHolder.letter.setVisibility(View.GONE); } if (position == 11) { itemHolder.num.setVisibility(View.GONE); itemHolder.letter.setVisibility(View.GONE); Drawable d = context.getResources().getDrawable(R.mipmap.num_back); LinearLayout layout = (LinearLayout) itemHolder.view; layout.setBackgroundResource(R.color.num_bg); ImageView imageView = new ImageView(context); imageView.setImageDrawable(d); imageView.setScaleType(ImageView.ScaleType.CENTER);//居中显示 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); lp.gravity = Gravity.CENTER; //<dimen name="back_num_item_magin_top">18sp</dimen> lp.topMargin = (int) context.getResources().getDimension(R.dimen.back_num_item_magin_top); layout.addView(imageView, lp); } } Log.i(TAG, "onBindViewHolder: " + position); } @Override public int getItemCount() { return data == null ? 0 : data.size(); } /** * 内部类ViewHolder,用于保存绑定控件,如果设置了点击事件,给控件设置点击监听 */ class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private TextView num; private TextView letter; private View view; public ViewHolder(View itemView) { super(itemView); num = (TextView) itemView.findViewById(R.id.num_item); letter = (TextView) itemView.findViewById(R.id.letter_item); view = itemView.findViewById(R.id.num_item_layout); itemView.setOnClickListener(this); } @Override public void onClick(View v) { if (clickListener != null) { clickListener.onItemClick(v, getPosition()); } } } /** * 定义一个接口用于外部实现RecycleView的item的操作 */ public interface OnItemClickListener { void onItemClick(View v, int position); } public List<NumItem> getData() { return data; } public void setData(List<NumItem> data) { this.data = data; }}
2.4分割线布局
<?xml version="1.0" encoding="utf-8"?><!--divider_bg.xml--><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="@color/diver_color"/> <size android:height="0.5dp" android:width="0.5dp"/></shape>
2.5DividerGridItemDecoration
这个完全就是鸿洋大神的代码复制过来的,但是为了方便还是贴一下吧。
import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;/** * Created by hui on 2017/7/7. */public class DividerGridItemDecoration extends RecyclerView.ItemDecoration{ private static final int[] ATTRS = new int[] { android.R.attr.listDivider }; private Drawable mDivider; public DividerGridItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { drawHorizontal(c, parent); drawVertical(c, parent); } private int getSpanCount(RecyclerView parent) { // 列数 int spanCount = -1; RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager) .getSpanCount(); } return spanCount; } public void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getLeft() - params.leftMargin; final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawVertical(Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getTop() - params.topMargin; final int bottom = child.getBottom() + params.bottomMargin; final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) { RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边 { return true; } } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); if (orientation == StaggeredGridLayoutManager.VERTICAL) { if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边 { return true; } } else { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一列,则不需要绘制右边 return true; } } return false; } private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一行,则不需要绘制底部 return true; } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); // StaggeredGridLayoutManager 且纵向滚动 if (orientation == StaggeredGridLayoutManager.VERTICAL) { childCount = childCount - childCount % spanCount; // 如果是最后一行,则不需要绘制底部 if (pos >= childCount) return true; } else // StaggeredGridLayoutManager 且横向滚动 { // 如果是最后一行,则不需要绘制底部 if ((pos + 1) % spanCount == 0) { return true; } } } return false; } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); int childCount = parent.getAdapter().getItemCount(); if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部 { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边 { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } }}
2.6获取数据
private List<NumItem> nums; private String letters[] = {"","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"}; public List<NumItem> getData(){ nums = new ArrayList<NumItem>(); for (int i = 0; i < 9; i++) { nums.add(new NumItem(String.valueOf(i+1),letters[i])); } nums.add(new NumItem("","")); nums.add(new NumItem("0","")); nums.add(new NumItem("←","")); return nums; }
2.7java生成Recyclerview
private RecyclerView numPanel; public void initRecyclerView(){ numPanel = (RecyclerView) findViewById(R.id.num_panel); RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this,3); numPanel.setLayoutManager(layoutManager); numPanel.setHasFixedSize(true); numPanel.setItemAnimator(new DefaultItemAnimator()); numPanel.addItemDecoration(new DividerGridItemDecoration(this)); numPanel.setAdapter(new NumItemAdapter(getData(),this)); }
自己写按钮逻辑吧。。
禁止系统输入法弹出:
public void hiddenInputMethod(){ int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; getWindow().addFlags(flags); }
初始化的时候调用就行了。
阅读全文
0 0
- RecyclerView打造一个密码面板
- 一步步打造一个属于自己的RecyclerView
- 为RecyclerView打造适配器
- RecyclerView:打造悬浮效果
- 用Silverlight打造一个相对安全的密码控件
- 打造一个安全的用户名密码登陆系统
- 打造RecyclerView的通用适配器
- 为RecyclerView打造万能适配器
- 打造 RecyclerView的 通用Adapter
- 为RecyclerView打造通用adapter
- 打造RecyclerView的万能适配器
- Android打造万能适配器--RecyclerView
- 为RecyclerView打造通用Adapter
- 为RecyclerView打造通用Adapter
- Diffutils打造不一样的recyclerview
- 【Android】RecyclerView:打造悬浮效果
- 用RecyclerView打造轮播图控件
- Databinding打造RecyclerView万能适配器
- hadoop启动不正常问题解决
- 解决oracle11g的最大内存占用
- 使用ffmpeg循环推流(循环读取视频文件)推送EasyDSS RTMP流媒体服务器的方法
- ubuntu 安装软件后将软件添加进启动器
- ntp同步时间服务
- RecyclerView打造一个密码面板
- maven build resources 的功能
- 一个简单的Windows程序及消息循环机制
- 十分钟学习字符集
- mysql中的affected_rows
- 15_heartrate所学(hw_sx_i1)
- MySQL数据类型和常用字段属性总结
- 莫队算法
- C++程序员学Java系列之七:Scanner类 和 引用数据类型