代码之家  ›  专栏  ›  技术社区  ›  Expiredmind

无休止的循环服务,当数据到达结尾时重复数据

  •  0
  • Expiredmind  · 技术社区  · 8 年前

    我想做一个基于recyclerview的列表,用户可以无限滚动,上面只有两个项目,但是每当用户滚动到最后,列表的第一个项目就会出现,所以只有一个。此功能可以在滚动的两个方向上工作。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Pier Giorgio Misley    8 年前

    你真幸运,我几天前做的。

    我解决问题的诀窍在于 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);
    
    }
    

    适配器

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

    我用这种方法(obj我改了名字,这样你就可以用你的名字来填了,因为我的一些名字和本地的很相似)。

    如果你有什么问题,可以随便问