Endless RecyclerView,结束时重复数据

Exp*_*ind 3 android listview android-recyclerview

我想制作基于 RecyclerView 的列表,用户可以无限滚动。上面只有几个项目,但是每当用户滚动到末尾时,列表的第一个项目就会出现等等。此功能可以在两个滚动方向上工作。

Pie*_*ley 6

你很幸运,我几天前就做到了。

我的解决方案中的技巧是覆盖 的getItemCount()adapter以便它可以Integer.MAX_VALUE使用价值。

getItemCount()被使用的recyclerview,以确定的多少项目有在列表中,如果它总是返回MAX_VALUE,该列表是非常无限。

这是我的例子:

活动

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mlayout);
    RecyclerView myRv = findViewById(R.id.myRv);

    ArrayList<MyObject> objectList = new ArrayList<>();
    objectList = retrieveObjectList();
    myRv.setLayoutManager(new SlowLayoutManager(myActivity.this));
    MyAdapter myAdapter = new MyAdapter(objectList);
    myRv.setAdapter(myAdapter);

}
Run Code Online (Sandbox Code Playgroud)

适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private ArrayList<MyObject> myObjects;

    public MyAdapter(ArrayList<MyObject> myObjects) {
        this.myObjects = myObjects;
    }

    //used to retrieve the effective item position in list
    public int getActualItemCount() {
        if (myObjects == null) {
            myObjects = new ArrayList<>();
        }
        return myObjects.size();
    }

    @Override
    public int getItemCount() {
        return Integer.MAX_VALUE;
    }

    @NonNull
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyAdapter.MyViewHolder(LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_view, parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull MessagesAdapter.MessagesViewHolder holder, int position) {
        if (myObjects.size() == 0) {
            holder.bind(null);
        } else {
            MyObject myObject = myObjects.get(position % myObjects.size());
            holder.bind(SMSMessage);
        }
    }

    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView myTv;

        MessagesViewHolder(View itemView) {
            super(itemView);
            myTv = itemView.findViewById(R.id.myTv);
        }

        void bind(MyObject myObject) {
            if (myObject != null) {
                myTv.setText(myObject.getProperty());
            } else {
                myTv.setText("");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用这种方式(obj 我更改了名称,以便您可以用您的名称填充它们,因为我的一些与本地名称相似)。

如果您有任何问题,请自由提问