你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
友情提醒:源码购买后不支持退换货
* Author:pei * Date: 2019/8/26 */ public class TestAdapterextends RecyclerView.Adapter { protected Context mContext; protected View mLayoutView; protected List mData; public TestAdapter(Context context,Listdata){ this.mContext=context; this.mData=data; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { mLayoutView= LayoutInflater.from(mContext).inflate(R.layout.item_layout,parent,false); ViewHolder viewHolder=new ViewHolder(mLayoutView); return viewHolder; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { String name=mData.get(position).toString(); ((ViewHolder)holder).mTvName.setText(name); } @Override public int getItemCount() { return mData==null?0:mData.size(); } class ViewHolder extends RecyclerView.ViewHolder{ TextView mTvName; public ViewHolder(View view) { super(view); mTvName=(TextView)view.findViewById(R.id.tv_name); } } } ``` TestAdapter对应的布局 item_layout 代码如下 ``` ``` 然后在MainActivity中准备50个字符串方便测试: ``` mList=new ArrayList<>(); for (int i = 0; i < 50; i++) { mList.add("同学"+i); } ``` MainActivity中给RecyclerView做些基本配置 ``` mTestAdapter=new TestAdapter(MainActivity.this,mList); LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this); layoutManager.setSmoothScrollbarEnabled(true); layoutManager.setAutoMeasureEnabled(true); mRecyclerView.setNestedScrollingEnabled(false); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mTestAdapter); ``` ok,这样RecyclerView列表显示已经准备好了。 ####三. 封装的 PositionScroller 类实现滚动item置顶 为了方便RecyclerView指定具体item置顶显示的功能,我将实现的代码封装到一个类 PositionScroller中。下面来讲讲PositionScroller中的方法 ``` //PositionScroller 类初始化 public PositionScroller(RecyclerView recyclerView) //滑动到指定位置 public void smoothMoveToPosition(int position) ``` 注释已经很明了了,需要注意的是,PositionScroller方法中有传一个RecyclerView 参数进去,初始化方法内部还对RecyclerView 滚动做了监听,用于处理实现滚动具体item置顶的功能。 smoothMoveToPosition方法中传的是具体itemde下标。 ok,下面看看PositionScroller 在MainActivity中如何使用。 第一步,你需要初始化PositionScroller ,并传入一个RecyclerView 控件: ``` //声明PositionScroller private PositionScroller mPositionScroller; //PositionScroller初始化 mPositionScroller=new PositionScroller(mRecyclerView); ``` 然后在调用的时候,你可以这样: ``` //mCurrentIndex为item的下标 mPositionScroller.smoothMoveToPosition(mCurrentIndex); ``` ####四. 实现滚动item置顶的另一种简单方式 利用PositionScroller类可以实现RecyclerView指定具体item置顶显示的功能,但是由于PositionScroller初始化时涉及到RecyclerView的滚动监听,当RecyclerView在使用的时候不涉及到滚动监听还好,如果涉及到滚动监听,势必会带来一些麻烦,也就是说PositionScroller由于单独封装的原因在使用的时候多少存在些隐患,还有就是PositionScroller类代码相对较多,因此我们还可以用另一个自己写的方法来实现滚动定位效果,这个方法是: ``` /*** * 滑动到指定位置(此position会列表置顶) * @param context * @param position */ public void moveToPosition(RecyclerView recyclerView,int position,Context context){ ``` 在需要使用的时候,你可以直接调用这个方法。 ####五. 滚动置顶在MainActivity中使用,MainActivity代码 下面贴出这两种方法在MainActivity中的使用代码: ``` package com.example.testdemo; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.Button; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearSmoothScroller; import androidx.recyclerview.widget.RecyclerView; import com.example.function.PositionScroller; import com.example.function.TestAdapter; import com.util.ToastUtil; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button mBtn; private RecyclerView mRecyclerView; private TestAdaptermTestAdapter; private ListmList; private PositionScroller mPositionScroller; private int mCurrentIndex=30; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); setListener(); } private void initData() { mBtn = findViewById(R.id.btn); mRecyclerView = findViewById(R.id.rv); mList=new ArrayList<>(); for (int i = 0; i < 50; i++) { mList.add("同学"+i); } mTestAdapter=new TestAdapter(MainActivity.this,mList); LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this); layoutManager.setSmoothScrollbarEnabled(true); layoutManager.setAutoMeasureEnabled(true); mRecyclerView.setNestedScrollingEnabled(false); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mTestAdapter); mPositionScroller=new PositionScroller(mRecyclerView); } private void setListener() { mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ToastUtil.shortShow("点击了:"+mCurrentIndex); // mPositionScroller.smoothMoveToPosition(mCurrentIndex); moveToPosition(mRecyclerView,mCurrentIndex,MainActivity.this); mCurrentIndex++; if(mCurrentIndex>49){ mCurrentIndex=0; } } }); } @Override public void onClick(View v) { } //以下方法省略 //...... } ``` ####六. 效果图和项目结构图 效果图 ![](/contentImages/image/20190829/hjWaayBp1SOxN2VWsfV.gif) 项目结构图 ![](/contentImages/image/20190829/nn6oHPLScJWMMnujgAl.png) ####七.其他 PositionScroller 类及 moveToPosition 方法代码详见Demo,这里不做赘述。
服务描述:微信加我验证时说明是:来自demo大师求助 服务范围:辅助将你有疑问的一个例子运行起来,并对该例子做技术方便的解答,服务时间为2天内,若需要其他特别需求或对从我这里下载的其他例子做解答价格另议
服务价格:¥50
我要联系