Android 如何在RecyclerView中实现部分可见的下一项
我使用onFling一次滚动一个项目,只希望一个项目在页面上完全可见,而下一个项目部分可见 我想在RecyclerView中实现这一点。下面是适配器代码,它的imageView代替了cardView(如图所示):Android 如何在RecyclerView中实现部分可见的下一项,android,android-recyclerview,Android,Android Recyclerview,我使用onFling一次滚动一个项目,只希望一个项目在页面上完全可见,而下一个项目部分可见 我想在RecyclerView中实现这一点。下面是适配器代码,它的imageView代替了cardView(如图所示): public class SimpleItemRecyclerViewAdapter extends RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder> { private final Array
public class SimpleItemRecyclerViewAdapter extends RecyclerView.Adapter<SimpleItemRecyclerViewAdapter.ViewHolder> {
private final ArrayList<Movie> mValues;
public SimpleItemRecyclerViewAdapter(ArrayList<Movie> items) {
mValues = items;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.movie_list_content, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.mItem = mValues.get(position);
Context context = holder.imageView.getContext();
String logo = mValues.get(position).getPosterPath();
Picasso.with(context).load(logo).into(holder.imageView);
}
@Override
public int getItemCount() {
return mValues.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public final View mView;
public ImageView imageView;
public Movie mItem;
MainActivity mainActivity = new MainActivity();
public ViewHolder(View view) {
super(view);
mView = view;
imageView = (ImageView) view.findViewById(R.id.image_movie_poster);
android.view.ViewGroup.LayoutParams params = imageView.getLayoutParams();
params.height = (int) (mainActivity.height * 0.7);
imageView.setLayoutParams(params);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "Clicked", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public String toString() {
return "Blah";
}
}
}
公共类SimpleItemRecycleServiceAdapter扩展了RecyclerView.Adapter{
私有最终数组列表mValues;
公共SimpleItemRecycleServiceAdapter(ArrayList项){
M值=项目;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.movie\u list\u content,parent,false);
返回新的ViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
holder.mItem=mValues.get(位置);
Context Context=holder.imageView.getContext();
字符串logo=mValues.get(position.getPosterPath();
毕加索.with(context).load(logo).into(holder.imageView);
}
@凌驾
public int getItemCount(){
返回mValues.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
公共最终视图mView;
公共影像视图;
公共电影螨;
MainActivity MainActivity=新的MainActivity();
公共视图持有者(视图){
超级(视图);
mView=视图;
imageView=(imageView)view.findViewById(R.id.image\u movie\u poster);
android.view.ViewGroup.LayoutParams params=imageView.getLayoutParams();
参数高度=(int)(mainActivity.height*0.7);
imageView.setLayoutParams(参数);
imageView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Toast.makeText(view.getContext(),“Clicked”,Toast.LENGTH_SHORT.show();
}
});
}
@凌驾
公共字符串toString(){
返回“废话”;
}
}
}
这适用于我的水平回收视图。您可以只更改为垂直布局管理器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
final SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
recyclerView.post(new Runnable() {
@Override
public void run() {
recyclerView.setAdapter(new TestAdapter());
}
});
}
private class TestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
final View view =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.test_card, parent, false);
int width = recyclerView.getWidth();
ViewGroup.LayoutParams params = view.getLayoutParams();
params.width = (int)(width * 0.8);
view.setLayoutParams(params);
return new TestViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
TestViewHolder holder = (TestViewHolder) viewHolder;
holder.numText.setText(((Integer) i).toString());
}
@Override
public int getItemCount() {
return 20;
}
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(新的LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
final SnapHelper SnapHelper=new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
recyclerView.post(新的Runnable(){
@凌驾
公开募捐{
setAdapter(newtestAdapter());
}
});
}
私有类TestAdapter扩展了RecyclerView.Adapter
{
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int i){
最终视图=
LayoutInflater.from(parent.getContext())
.充气(R.layout.test_卡,父级,假);
int width=recyclerView.getWidth();
ViewGroup.LayoutParams params=view.getLayoutParams();
参数宽度=(int)(宽度*0.8);
view.setLayoutParams(参数);
返回新的TestViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder ViewHolder,int i){
TestViewHolder=(TestViewHolder)viewHolder;
holder.numText.setText(((整数)i.toString());
}
@凌驾
public int getItemCount(){
返回20;
}
}
您可以使用自定义布局管理器来控制每个项目的显示方式
class RatioLayoutManager构造函数(
上下文:上下文?,
@RecyclerView.Orientation方向:Int=RecyclerView.VERTICAL,
reverseLayout:Boolean=false
):LinearLayoutManager(上下文、方向、反转){
var比率=0.7f
private val horizontalSpace get()=width-paddingStart-paddingEnd
private val verticalSpace get()=width-paddingTop-paddingBottom
重写fun generateDefaultLayoutParams()=
scaledLayoutParams(super.GeneratedFaultLayoutParams())
覆盖有趣的generateLayoutParams(lp:ViewGroup.LayoutParams?)=
scaledLayoutParams(super.generateLayoutParams(lp))
覆盖有趣的generateLayoutParams(c:Context?,attrs:AttributeSet?)=
scaledLayoutParams(super.generateLayoutParams(c,attrs))
private fun scaledLayoutParams(layoutParams:RecyclerView.layoutParams)=
layoutParams.apply{
何时(定向){
水平->宽度=(水平空间*比率+0.5).toInt()
垂直->高度=(垂直空间*比率+0.5).toInt()
}
}
}
我认为您必须找到屏幕高度,并根据设置的卡高度,请查看以下库@RaviGadipudi。事实上,我尝试了这个库,但无法获得我想要的。我希望只有下一个项目应该是可见的,而不是前一个。但当我使用这个库时,上一个和下一个项目都变得略微可见了。@masoudvali快到了,谢谢,伙计。只是一个小问题,当我向下滚动时,应用程序工作正常,但当我向上滚动时,它显示的是上一个项目,而不是下一个项目。@BhaveshMisri你能把你的适配器代码放在这里吗。但是第一个屏幕中的下一个项目将有更多的可见部分,而在下一个屏幕中,从上一个屏幕到下一个屏幕的可见部分将更少。如何确保相同的部分在所有情况下都可见?