簡體   English   中英

RecyclerView 僅在添加更多項目時顯示新項目

[英]RecyclerView only shows new items when more items are added

我有一個無限滾動的RecyclerView 當片段打開時,它會將前十個項目加載到RecyclerView ,一切都很好。 但是當它加載接下來的十個項目時,它不會將它們添加到現有項目中,而是刪除舊項目並僅顯示新項目。

所以我的問題是:當我加載更多時,為什么不保留舊物品?

我從這里使用無盡滾動。

片段.java


public class twoFragment extends Fragment implements LifecycleOwner {

    private twoViewModel twoViewModel;
    private RecyclerView recyclerView;
    private RecyclerViewAdapter recyclerViewAdapter;
    private EndlessRecyclerViewScrollListener scrollListener;
    WebRequest webRequest  = new WebRequest();

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        System.out.println("************ onCreateView ***********");

        System.out.println("************ ViewModelProvider ***********");
        twoViewModel = new ViewModelProvider(this).get(twoViewModel.class);
        View root = inflater.inflate(R.layout.two, container, false);
        recyclerView = root.findViewById(R.id.rv_main);
        recyclerView.setHasFixedSize(true);


        recyclerViewAdapter = new RecyclerViewAdapter(requireActivity());
        final int columns = getResources().getInteger(R.integer.gallery_columns);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(requireActivity(), columns);
        recyclerView.setLayoutManager(gridLayoutManager);



       // Endless scrolling
        scrollListener = new EndlessRecyclerViewScrollListener(gridLayoutManager) {
            @Override
            public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
                // Triggered only when new data needs to be appended to the list
                // Add whatever code is needed to append new items to the bottom of the list
                System.out.println("************ onLoadMore >>> EndlessRecyclerViewScrollListener ***********");
                System.out.println("************ onLoadMore >>> page  ***********" + page);

             
                webRequest.MakeRequest("BROWSE_REQUEST", page +1, "",  twoViewModel.getUserMutableLiveData());


            }
        };
        // Adds the scroll listener to RecyclerView
        recyclerView.addOnScrollListener(scrollListener);


        twoViewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(),userListUpdateObserver);
        

        return root;
        };

        private Observer<ArrayList<User>> userListUpdateObserver = new Observer<ArrayList<User>>() {
            @Override
            public void onChanged(ArrayList<User> userArrayList) {
                System.out.println("************ onChanged ***********");
                 recyclerView.setAdapter(recyclerViewAdapter);
                ((RecyclerViewAdapter)recyclerView.getAdapter()).setData(userArrayList);
                
            }
        };

}

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    Activity context;
    private ArrayList<User> userArrayList;
    public RecyclerViewAdapter(Activity context) {
        this.context = context;
        this.userArrayList = userArrayList;

    }

    public void setData(ArrayList<User> userArrayListOne){
        userArrayList = userArrayListOne;
        notifyDataSetChanged();
        System.out.println("%% %% notifyDataSetChanged %% %%");
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        System.out.println("************ onCreateViewHolder ***********");
        View rootView = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
        return new RecyclerViewViewHolder(rootView);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        System.out.println("************ onBindViewHolder ***********");
        User user = userArrayList.get(position);
        RecyclerViewViewHolder viewHolder= (RecyclerViewViewHolder) holder;

        // Set title as HTML code on view
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            viewHolder.txtView_title.setText(Html.fromHtml(user.getTitle(), Html.FROM_HTML_MODE_COMPACT));
        } else {
            viewHolder.txtView_title.setText(Html.fromHtml(user.getTitle()));
        }

        viewHolder.txtView_description.setText(user.getDescription()); // TODO add error png
        Glide.with(context).load(user.getImagePath()).centerInside().error(R.drawable.yahushuas_commands_pt__2).into(viewHolder.imgView_icon);

    }

    @Override
    public int getItemCount() {
            return userArrayList.size();
    }

    class RecyclerViewViewHolder extends RecyclerView.ViewHolder {
        ImageView imgView_icon;
        TextView txtView_title;
        TextView txtView_description;

        public RecyclerViewViewHolder(@NonNull View itemView) {
            super(itemView);
            imgView_icon = itemView.findViewById(R.id.imgView_icon);
            txtView_title = itemView.findViewById(R.id.txtView_title);
            txtView_description = itemView.findViewById(R.id.txtView_description);


        }
    }
}

RecyclerViewAdapter.javasetData方法中,您userArrayList通過分配新的ArrayList來更新userArrayList 因此,舊數據正在被替換。 您需要將新數據添加到現有列表中。

private ArrayList<User> userArrayLis = new ArrayList<User>(); // Initialise the arraylist

public void setData(ArrayList<User> userArrayListOne){
    userArrayList.addAll(userArrayListOne);
    notifyDataSetChanged();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM