前言
最近在用饿了么的时候,在使用“谁去拿外卖”的时候,感觉这个东西很有意思,所以就试着自己实现了一下,其中,当最小数值所在item向上滑出界面时,让该item的内容固定到顶部,这个快的代码和淘票票的一些功能很像,之前在用淘票票的时候就感觉很好玩,借这次机会就写了一下。当然还有一个小功能没有实现,就是添加item时,item里共享控件的动画,类似activity之间共享元素转场动画,这个小功能之后如果研究出来再更新一下。
代码
还是老规矩,直接上代码
mainActivity代码
public class MainActivity extends AppCompatActivity implements DemoAdapter.OnItemClickListener { private LinearLayout linearLayout; private RecyclerView mRv; private RelativeLayout min; private TextView mTitle, mMsg, mPosition; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { linearLayout = (LinearLayout) findViewById(R.id.ll_content); min = (RelativeLayout) findViewById(R.id.min); min.setBackgroundColor(Color.parseColor("#303F9F")); mRv = (RecyclerView) findViewById(R.id.rv_demo); mTitle = (TextView) findViewById(R.id.tv_demo); mMsg = (TextView) findViewById(R.id.tv_msg); mMsg.setVisibility(View.VISIBLE); mPosition = (TextView) findViewById(R.id.tv_position); final DemoAdapter adapter = new DemoAdapter(this); mRv.setAdapter(adapter); final LinearLayoutManager manager = new LinearLayoutManager(this); mRv.setLayoutManager(manager); mRv.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); final Random random = new Random(); findViewById(R.id.iv_img).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /*img 的点击时间,每点击一次,生成一个100以内的随机数*/ adapter.addData(random.nextInt(100)); mRv.scrollToPosition(adapter.getItemCount() - 1); mTitle.setText(adapter.getMin() + ""); mPosition.setText((adapter.getMin_position() + 1) + ""); } }); mRv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); /*RecyclerView 的滑动监听,当最小数所在position向上滑出界面时, 显示和item一样布局的一个Relativelayout,此布局和RecyclerView在一个FrameLayout里*/ int first_position = manager.findFirstVisibleItemPosition(); if (adapter.getMin_position() <= first_position) { min.setVisibility(View.VISIBLE); } else { min.setVisibility(View.GONE); } } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } }); } }activity_main代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/ll_content" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/iv_img" android:src="@drawable/bigbang" android:layout_width="wrap_content" android:layout_height="200dp" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_demo" android:background="#FFFFFF" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> <include android:visibility="gone" android:id="@+id/min" layout="@layout/list_item_demo"/> </FrameLayout> </LinearLayout>DemoAdapter代码
public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.ViewHolder>{ private ArrayList<Integer>mDatas = new ArrayList<>(); private Activity mContext; private int min = -1; private int min_position = 0; public int getMin(){ return min; } public DemoAdapter(Activity context){ mContext = context; } @Override public DemoAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { DemoAdapter.ViewHolder holder = new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.list_item_demo,parent,false)); return holder; } @Override public void onBindViewHolder(DemoAdapter.ViewHolder holder, int position) { final int data = mDatas.get(position); holder.mTitle.setText(data+""); holder.mPosition.setText((position+1)+""); if (data==min){ min_position = position; holder.itemView.setBackgroundColor(Color.parseColor("#303F9F")); holder.mMsg.setVisibility(View.VISIBLE); }else { holder.mMsg.setVisibility(View.GONE); holder.itemView.setBackgroundColor(Color.parseColor("#D2D2D2")); } } @Override public int getItemCount() { return mDatas.size(); } public void addData(int data){ if (mDatas.contains(data)){ /*如果已经有了和data相等的数,则不添加*/ return; } if (min==-1){ min = data; }else { min = min>=data?data:min; } this.mDatas.add(data); notifyItemInserted(mDatas.size()); if (min==data) { notifyItemChanged(min_position); } } public int getMin_position() { return min_position; } public class ViewHolder extends RecyclerView.ViewHolder { private TextView mTitle,mMsg,mPosition; public ViewHolder(View itemView) { super(itemView); mTitle = (TextView)itemView.findViewById(R.id.tv_demo); mMsg = (TextView)itemView.findViewById(R.id.tv_msg); mPosition = (TextView)itemView.findViewById(R.id.tv_position); } } }list_item_demo代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:background="#D2D2D2" android:paddingBottom="10dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:transitionName="item_title" android:text="10" android:textColor="#FFFFFF" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:background="@drawable/shape_circle" android:textSize="20sp" android:gravity="center" android:id="@+id/tv_demo" android:layout_width="40dp" android:layout_height="40dp" /> <TextView android:id="@+id/tv_msg" android:visibility="gone" android:textColor="#FFFFFF" android:textSize="12sp" android:layout_marginLeft="15dp" android:layout_centerVertical="true" android:layout_toRightOf="@+id/tv_demo" android:text="你的数字最小\n乖乖去拿外卖" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_marginRight="10dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:text="10" android:textColor="@color/colorAccent" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:background="@drawable/shape_circle_white" android:textSize="10sp" android:gravity="center" android:id="@+id/tv_position" android:layout_width="20dp" android:layout_height="20dp" /> </RelativeLayout>
说明
item共享控件,在添加item的过渡动画还没有实现,暂时自己也没有思路,希望能够实现这个功能打大神,指点一下。