【问题标题】:How to achieve partially visible next item in RecyclerView如何在 RecyclerView 中实现部分可见的下一项
【发布时间】:2020-03-28 10:23:03
【问题描述】:

我正在使用 onFling 一次滚动一个项目,并且希望只有一个项目在页面上完全可见,而下一个项目部分可见。

我想要这个,如何在 RecyclerView 中实现。这是适配器代码,只是代替cardView(如图所示),它是imageView:

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";
    }
}
}

【问题讨论】:

  • 我认为您必须找到屏幕高度并根据该高度设置您的卡片高度
  • @RaviGadipudi 我实际上,我尝试了这个库,但无法得到我想要的。我希望只有下一个项目应该可见,而不是前一个项目。但是当我使用这个库时,上一个和下一个项目都变得略微可见。
  • @masoudvali 差不多了,谢谢,伙计。只是一个小问题,当我向下滚动时,应用程序运行正常,但是当我向上滚动时,它显示的是上一项而不是下一项。
  • @BhaveshMisri 你能把你的适配器代码放在这里

标签: android android-recyclerview


【解决方案1】:

这适用于我的水平回收视图。您可以更改为垂直布局管理器。

@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;
    }
}

【讨论】:

  • 为我工作。但是第一个屏幕中的下一个项目将有更多可见部分,而在下一个屏幕中,前一个和下一个屏幕将有一个较小的部分可见。如何确保所有情况下都可以看到相同的部分?
【解决方案2】:

您可以使用自定义布局管理器来控制每个项目的显示方式

class RatioLayoutManager constructor(
        context: Context?,
        @RecyclerView.Orientation orientation: Int = RecyclerView.VERTICAL,
        reverseLayout: Boolean = false
) : LinearLayoutManager(context, orientation, reverseLayout) {

    var ratio = 0.7f

    private val horizontalSpace get() = width - paddingStart - paddingEnd

    private val verticalSpace get() = width - paddingTop - paddingBottom

    override fun generateDefaultLayoutParams() =
            scaledLayoutParams(super.generateDefaultLayoutParams())

    override fun generateLayoutParams(lp: ViewGroup.LayoutParams?) =
            scaledLayoutParams(super.generateLayoutParams(lp))

    override fun generateLayoutParams(c: Context?, attrs: AttributeSet?) =
            scaledLayoutParams(super.generateLayoutParams(c, attrs))

    private fun scaledLayoutParams(layoutParams: RecyclerView.LayoutParams) =
            layoutParams.apply {
                when (orientation) {
                    HORIZONTAL -> width = (horizontalSpace * ratio + 0.5).toInt()
                    VERTICAL -> height = (verticalSpace * ratio + 0.5).toInt()
                }
            }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多