xml布局
<LinearLayout android:background="@color/colorWhite" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activity.SpikeActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/spike_recy" android:layout_width="match_parent" android:layout_height="wrap_content"></androidx.recyclerview.widget.RecyclerView> <androidx.viewpager.widget.ViewPager android:id="@+id/spike_viewpager" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
Activity里面的操作
给viewpager和recyclerview赋值
List<Fragment> fragments = new ArrayList<>(); fragments.add(new FeaturedFragemnt()); fragments.add(new MakeupsFragment()); fragments.add(new FeaturedFragemnt()); fragments.add(new MakeupsFragment()); fragments.add(new FeaturedFragemnt()); fragments.add(new MakeupsFragment()); mBindingView.spikeViewpager.setAdapter(new MovieAdapter(getSupportFragmentManager(),fragments)); for (int i = 0;i<6;i++){ list.add(new SpikeList("10:00","已抢购")); } gridLayoutManager = new GridLayoutManager(this, 1, OrientationHelper.HORIZONTAL, false); mBindingView.spikeRecy.setLayoutManager(gridLayoutManager); spikeAdpter = new SpikeAdpter(this, list); mBindingView.spikeRecy.setAdapter(spikeAdpter);
// Fragment的适配器
public class MovieAdapter extends FragmentPagerAdapter { List<Fragment> fragments; public MovieAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm); this.fragments = fragments; } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } }
//recyclerview的适配器
public static class SpikeAdpter extends RecyclerView.Adapter<SpikeAdpter.SpikeHolder>{ private Context context; private List<SpikeList> list; OnItemClickLisenter onItemClickLisenter; //点击跳目变色的状态值 private List<Boolean> isClicks; public int pos; public void setOnItemClickLisenter(OnItemClickLisenter onItemClickLisenter) { this.onItemClickLisenter = onItemClickLisenter; } public void setBg(int pos) { this.pos = pos; getPot(pos); } public SpikeAdpter(Context context, List<SpikeList> list) { this.context = context; this.list = list; isClicks = new ArrayList<>(); for(int i = 0;i<list.size();i++){ isClicks.add(false); } } @NonNull @Override public SpikeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return new SpikeHolder(LinearLayout.inflate(context,R.layout.spike_layout,null)); } @SuppressLint("ResourceAsColor") @Override public void onBindViewHolder(@NonNull SpikeHolder holder, int position) { holder.time.setText(list.get(position).getTime()); holder.grad.setText(list.get(position).getGrad()); Log.i("TAG",pos+"ssssssssssssssssss"); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击条目进行接口回调传值 onItemClickLisenter.setClick(v,holder.getLayoutPosition()); //点击条目进行变色触发变色的方法 getPot(position); } }); if(isClicks.get(position)){ holder.time.setTextColor(Color.parseColor("#ffa500")); holder.grad.setTextColor(Color.parseColor("#ffa500")); }else{ holder.time.setTextColor(Color.parseColor("#ffffff")); holder.grad.setTextColor(Color.parseColor("#ffffff")); } } void getPot(int p){ for(int i = 0; i <isClicks.size();i++){ isClicks.set(i,false); } isClicks.set(p,true); notifyDataSetChanged(); } @Override public int getItemCount() { return list.size(); } public class SpikeHolder extends RecyclerView.ViewHolder{ private TextView time,grad; public SpikeHolder(@NonNull View itemView) { super(itemView); time = itemView.findViewById(R.id.spike_title); grad = itemView.findViewById(R.id.spike_time); } } //接口回调 interface OnItemClickLisenter{ void setClick(View view,int i); } }
//Recyclerview里面展示数据的xml
<RelativeLayout android:layout_marginLeft="@dimen/dp_20" android:layout_marginTop="@dimen/dp_20" android:layout_marginRight="@dimen/dp_10" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:text="sssssssssssssssss" android:textColor="@color/colorWhite" android:id="@+id/spike_time" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView> <TextView android:textColor="@color/colorWhite" android:layout_below="@id/spike_time" android:id="@+id/spike_title" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView> </RelativeLayout>
//viewpager滑动并选择Recyclerview的条目
mBindingView.spikeViewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mBindingView.spikeRecy.smoothScrollToPosition(position); int size = fragments.size()-1; if (position<=size){ spikeAdpter.getPot(position); }else { } } @Override public void onPageScrollStateChanged(int state) { } });
//适配器的接口回调获取Recyclerview的下标并赋值给Viewpager实现所对应的viewpager的下标
spikeAdpter.setOnItemClickLisenter(new SpikeAdpter.OnItemClickLisenter() { @Override public void setClick(View view,int position) { mBindingView.spikeViewpager.setCurrentItem(position); int size = list.size(); if(size>2){ if ( position> 1 && position< size - 2) { moveToCenter(view); }else if (position>= 0 && position< 2) { mBindingView.spikeRecy.smoothScrollToPosition(0); } else { mBindingView.spikeRecy.smoothScrollToPosition(size-1); } } } });
//点击条目条目居中
private void moveToCenter(View itemView) { int[] locationView = new int[2]; itemView.getLocationOnScreen(locationView); int viewWidth = itemView.getWidth(); WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(dm); int centerX = dm.widthPixels / 2; int distance = locationView[0] - centerX + viewWidth / 2; mBindingView.spikeRecy.smoothScrollBy(distance, 0); }
//为自定的bean类
public class SpikeList{ private String time; private String grad; public SpikeList(String time, String grad) { this.time = time; this.grad = grad; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getGrad() { return grad; } public void setGrad(String grad) { this.grad = grad; } }