无法在回收者视图中正确显示项目分页问题

如何解决无法在回收者视图中正确显示项目分页问题

当用户滚动到末尾时尝试加载更多项目时,将显示并删除进度对话框,然后再次显示,然后显示更多项目,但是仍未从回收者视图中删除进度对话框。有时会删除进度对话框,但仍然需要更多时间在回收者视图中显示更多项目。我正在使用firestore addOnSuccessListener从云Firestore检索项目并将其添加到arraylist,然后将高级广告添加到该arraylist并将数据添加到回收站适配器。

显示回收者视图项的活动MovieLists.java

public class MovieLists extends AppCompatActivity implements ItemInterface{

    //nothing important just a comment
    boolean runshowMovieOnce = true;
    Query mQuery;
    int loaderPosition;
    DocumentSnapshot lastVisible;
    String docId,catName,titleName;
    ItemInterface itemInterface;
    DatabaseReference listData;
    String VideoId;
    MovieListAdapter movieListAdapter;
    RecyclerView movieLists;

    // List of native ads that have been successfully loaded.
    private List<UnifiedNativeAd> mNativeAds = new ArrayList<>();
    List<Object> itemDatas = new ArrayList<>();
    LinearLayoutManager layoutManager;
    // The number of native ads to load.
    public static final int NUMBER_OF_ADS = 2;

    // The AdLoader used to load ads.
    private AdLoader adLoader;
    int index = 2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_movie_lists);

        MaterialToolbar mToolBar = (MaterialToolbar) findViewById(R.id.imagePreviewToolbar);
        setSupportActionBar(mToolBar);
        docId = getIntent().getStringExtra("documentId");
        catName = getIntent().getStringExtra("catName");
        titleName = getIntent().getStringExtra("titleName");
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_button);
            getSupportActionBar().setTitle(titleName);
        }

        movieLists = (RecyclerView)findViewById(R.id.movie_lists);
        layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        itemInterface = this;
        loadMovies();
    }

    @Override
    public void onFirebaseLoadSuccess(List<Object> itemDataList) {
        loadNativeAds();
    }

    @Override
    public void onFirebaseLoadFailed(String message) {

    }

    @SuppressLint("MissingPermission")
    private void loadNativeAds() {

        AdLoader.Builder builder = new AdLoader.Builder(this,"ca-app-pub-3940256099942544/8135179316");
        adLoader = builder.forUnifiedNativeAd(
                new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
                    @Override
                    public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
                        // A native ad loaded successfully,check if the ad loader has finished loading
                        // and if so,insert the ads into the list.
                        mNativeAds.add(unifiedNativeAd);
                        if (!adLoader.isLoading()) {
                            insertAdsInMenuItems();
                        }
                    }
                }).withAdListener(
                new AdListener() {
                    @Override
                    public void onAdFailedToLoad(int errorCode) {
                        // A native ad failed to load,insert the ads into the list.
                        Log.e("MainActivity","The previous native ad failed to load. Attempting to"
                                + " load another.");
                        if (!adLoader.isLoading()) {
                            insertAdsInMenuItems();
                        }
                    }
                }).build();

        // Load the Native ads.
        adLoader.loadAds(new AdRequest.Builder().build(),NUMBER_OF_ADS);
    }

    private void insertAdsInMenuItems() {
        if (mNativeAds.size() <= 0) {
            return;
        }
        int offset = 3;

        for (UnifiedNativeAd ad : mNativeAds) {
            if (index<itemDatas.size()) {
                itemDatas.add(index,ad);
            }
            index = index + offset;
        }
        //index = itemDatas.size() - 3;

        if (runshowMovieOnce){
            showMoviesList();
        }
        runshowMovieOnce = false;
    }

    private void showMoviesList() {
        movieLists.setLayoutManager(layoutManager);
        movieListAdapter = new MovieListAdapter(movieLists,MovieLists.this,itemDatas);
        movieLists.setHasFixedSize(true);
        movieLists.setAdapter(movieListAdapter);

        movieListAdapter.setLoadMore(new ILoadMore() {
            @Override
            public void onLoadMore() {
                    itemDatas.add(null);

                movieLists.post(new Runnable() {
                    public void run() {
                        movieListAdapter.notifyItemInserted(itemDatas.size() - 1);
                        Log.d("load position insert",""+(itemDatas.size()-1));
                    }
                });

                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {

                            itemDatas.remove(itemDatas.size()-1);
                            movieListAdapter.notifyItemRemoved(itemDatas.size() - 1);
                            Log.d("load position rem",""+(itemDatas.size()-1));
                            int previousListSize = itemDatas.size();
                            Log.d("previousListSize",""+previousListSize);
                            loadMovies();
                            int newListSize = itemDatas.size();
                            Log.d("newListSize",""+newListSize);
                            movieListAdapter.notifyDataSetChanged();
                            movieListAdapter.setLoaded();

                        }
                    },5000);

            }
        });
    }

    private void loadMovies() {

        FirebaseFirestore mFirestore = FirebaseFirestore.getInstance();
        CollectionReference mPostsCollection = mFirestore.collection(catName).document(docId).collection("listItem");

        //Defining Query cursors
        if (lastVisible == null){
            mQuery = mPostsCollection.orderBy("pr",Query.Direction.ASCENDING)
                    .limit(6);
        }else {
            mQuery = mPostsCollection.orderBy("pr",Query.Direction.ASCENDING)
                    .startAfter(lastVisible)
                    .limit(6);
        }

        mQuery.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot documentSnapshots) {

                for (QueryDocumentSnapshot documentSnapshot : documentSnapshots){
                    ItemData itemData = documentSnapshot.toObject(ItemData.class);
                    itemDatas.add(itemData);
                    Log.d("movie name",itemData.getVn());
                }

                // Get the last visible document
                if (documentSnapshots.size() > 0)
                lastVisible = documentSnapshots.getDocuments()
                        .get(documentSnapshots.size() -1);

                onFirebaseLoadSuccess(itemDatas);
            }

        });
    }
}

MovieListAdapter.java

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

    List<Object> itemDatas;
    Context context;
    String urlStart = "https://i1.ytimg.com/vi/";
    String urlLast = "/mqdefault.jpg";
    private static final int MOVIE_ITEM_VIEW_TYPE = 0;
    private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;
    private final int VIEW_TYPE_LOADING = 2;
    boolean isLoading;
    ILoadMore loadMore;
    int visibleThreshold ;
    int lastVisibleItem,totalItemCount;

    View itemV;

    public MovieListAdapter(RecyclerView recyclerView,Context context,@NonNull List<Object> itemData) {
        this.itemDatas = itemData;
        this.context = context;
        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager)recyclerView.getLayoutManager();
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView,int dx,int dy) {
                super.onScrolled(recyclerView,dx,dy);
                    totalItemCount = linearLayoutManager.getItemCount();
                    visibleThreshold = linearLayoutManager.getChildCount();
                    lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                    if (!isLoading && (visibleThreshold + lastVisibleItem) >= totalItemCount){
                        if (loadMore != null){
                            loadMore.onLoadMore();
                            isLoading = true;
                        }

                    }
            }
        });
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        switch (viewType) {
            case UNIFIED_NATIVE_AD_VIEW_TYPE:
                View unifiedNativeLayoutView = LayoutInflater.from(
                        parent.getContext()).inflate(R.layout.ad_unified,parent,false);
                return new UnifiedNativeAdViewHolder(unifiedNativeLayoutView);
            case VIEW_TYPE_LOADING:
                View viewL = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_loading,false);
                return new LoadingViewHolder(viewL);
            case MOVIE_ITEM_VIEW_TYPE:
                // Fall through.
            default: {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_movie_list,false);

                return new MovieListAdapter.MovieListsMyViewHolder(view);
            }
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder myViewHolder,int i) {
        //int viewType = getItemViewType(i);

        if (myViewHolder instanceof MovieListAdapter.MovieListsMyViewHolder){
            MovieListsMyViewHolder movieListsMyViewHolder = (MovieListsMyViewHolder) myViewHolder;
            ItemData model = (ItemData)itemDatas.get(i);

            movieListsMyViewHolder.txt_item_title.setText(model.getVn());
            String urlImage = urlStart + model.getVi() + urlLast;
            Log.e("urlImage",urlImage);
            Glide.with(context)
                    .load(urlImage)
                    .placeholder(R.drawable.placeholder)
                    .error(R.drawable.placeholder)
                    .centerCrop()
                    .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
                    .into(movieListsMyViewHolder.img_title);

            movieListsMyViewHolder.setiItemClickListener(new IItemClickListener() {
                @Override
                public void onItemclickListener(View view,int position) {

                    ItemData itemData = new ItemData(model.getVi(),model.getVn(),model.getVd(),model.getPr(),model.getTc(),model.getVvc());
                    Log.d("Tmdb ID",String.valueOf(model.getTc()));
                    MovieDetails.startActivity(context,((MovieListsMyViewHolder) myViewHolder).transformationLayout,itemData);

                }
            });
        }else if (myViewHolder instanceof UnifiedNativeAdViewHolder){
            Object recyclerViewItems = itemDatas.get(i);
            UnifiedNativeAd nativeAd = (UnifiedNativeAd) recyclerViewItems;
            populateNativeAdView(nativeAd,((UnifiedNativeAdViewHolder) myViewHolder).getAdView());
        }else if (myViewHolder instanceof LoadingViewHolder){
            LoadingViewHolder loadingViewHolder = (LoadingViewHolder)myViewHolder;
            loadingViewHolder.progressBar.setIndeterminate(true);
        }
    }

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

    public class MovieListsMyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        AppCompatTextView txt_item_title;
        ImageView img_title;
        IItemClickListener iItemClickListener;
        CardView itemCardView;
        TransformationLayout transformationLayout;

        public void setiItemClickListener(IItemClickListener iItemClickListener) {
            this.iItemClickListener = iItemClickListener;
        }

        public MovieListsMyViewHolder(@NonNull View itemView) {
            super(itemView);
            itemV = itemView;
            txt_item_title = (AppCompatTextView) itemView.findViewById(R.id.item_movie_Title);
            img_title = (ImageView)itemView.findViewById(R.id.item_movie_Image);
            //itemCardView = (CardView)itemView.findViewById(R.id.item_cardview);
            //itemCardView.setOnClickListener(this);
            transformationLayout = (TransformationLayout)itemView.findViewById(R.id.transformationMovieLayout);
            transformationLayout.setOnClickListener(this);
        }

        @Override
        public void onClick(View view){
            iItemClickListener.onItemclickListener(view,getAdapterPosition());
        }

    }

    private void populateNativeAdView(UnifiedNativeAd nativeAd,UnifiedNativeAdView adView) {
        // Some assets are guaranteed to be in every UnifiedNativeAd.
        ((TextView) adView.getHeadlineView()).setText(nativeAd.getHeadline());
        ((TextView) adView.getBodyView()).setText(nativeAd.getBody());
        ((Button) adView.getCallToActionView()).setText(nativeAd.getCallToAction());

        // These assets aren't guaranteed to be in every UnifiedNativeAd,so it's important to
        // check before trying to display them.
        NativeAd.Image icon = nativeAd.getIcon();

        if (icon == null) {
            adView.getIconView().setVisibility(View.INVISIBLE);
        } else {
            ((ImageView) adView.getIconView()).setImageDrawable(icon.getDrawable());
            adView.getIconView().setVisibility(View.VISIBLE);
        }

        if (nativeAd.getPrice() == null) {
            adView.getPriceView().setVisibility(View.INVISIBLE);
        } else {
            adView.getPriceView().setVisibility(View.VISIBLE);
            ((TextView) adView.getPriceView()).setText(nativeAd.getPrice());
        }

        if (nativeAd.getStore() == null) {
            adView.getStoreView().setVisibility(View.INVISIBLE);
        } else {
            adView.getStoreView().setVisibility(View.VISIBLE);
            ((TextView) adView.getStoreView()).setText(nativeAd.getStore());
        }

        if (nativeAd.getStarRating() == null) {
            adView.getStarRatingView().setVisibility(View.INVISIBLE);
        } else {
            ((RatingBar) adView.getStarRatingView())
                    .setRating(nativeAd.getStarRating().floatValue());
            adView.getStarRatingView().setVisibility(View.VISIBLE);
        }

        if (nativeAd.getAdvertiser() == null) {
            adView.getAdvertiserView().setVisibility(View.INVISIBLE);
        } else {
            ((TextView) adView.getAdvertiserView()).setText(nativeAd.getAdvertiser());
            adView.getAdvertiserView().setVisibility(View.VISIBLE);
        }

        // Assign native ad object to the native view.
        adView.setNativeAd(nativeAd);
    }
    @Override
    public int getItemViewType(int position) {
        //DocumentSnapshot itemData = getItem(position);
        Object recyclerViewItem = itemDatas.get(position);
        if (recyclerViewItem instanceof UnifiedNativeAd) {
            return UNIFIED_NATIVE_AD_VIEW_TYPE;
        }else if (itemDatas.get(position) == null){
            return VIEW_TYPE_LOADING;
        }else {
            return MOVIE_ITEM_VIEW_TYPE;
        }
    }

    public void setLoadMore(ILoadMore loadMore){
        this.loadMore = loadMore;
    }

    private class LoadingViewHolder extends RecyclerView.ViewHolder {

        ProgressBar progressBar;

        public LoadingViewHolder(@NonNull View itemView) {
            super(itemView);
            progressBar = itemView.findViewById(R.id.progressBar);
        }
    }

    public void setLoaded(){
        isLoading = false;
    }

}

ScreenCapture of how recyclerview is displaying items

解决方法

短期答案:您的代码中发生了很多事情。如果只想删除loadingProgress,请在void viewsLoaded()的LoadingViewHolder内添加一个progressbar.setVisibility(View.GONE)方法,如果{Heller}不是,则在on if(myViewHolder instanceof LoadingViewHolder)的onBindViewHolder方法内,调用viewsLoaded()方法。定位为适配器上的最后一个。

长期答案:如果要提高性能,请阅读有关如何使用DiffUtil.ItemCallback<>而不是使用用于简单小型数据集的notifydatasetchanged()的信息。您在活动中有一个objectData列表,在适配器上有另一个,请阅读有关使用LiveData,数据绑定和MVVM模式的信息。

,

我建议您首先应该在Scroll View Listener中获得linearLayoutManager

另一个建议是不调用 movieListAdapter.notifyItemInserted(itemDatas.size() - 1);在Runnable内部进行异步,因为在将null添加到列表后,应通知适配器

itemsData.add(null);
movieListAdapter.notifyItemInserted(itemsData.size() - 1);

另一行在itemDatas.remove(itemDatas.size()-1)

从列表中删除项目后,列表大小将减小一。

所以这是正确的:

movieListAdapter.notifyItemRemoved(itemDatas.size());

我希望这些会有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-