Recyclew和viewpager实现联动 并点击recyclerview条目居中

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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值