android - 在 recyclerview 中将高度设置为 wrap_content 时不显示图像

标签 android android-recyclerview

我想做什么?

垂直显示 20 张图像。滚动到最后一张图片时必须请求接下来的 20 张图片(分页或无限滚动)。

发生了什么事?

使用高度设置为 wrap_content 的 recyclerview:没有显示任何图像。

使用高度设置为 match_parent 的 recylerview:我可以看到图像,但在显示第 5 个图像时会调用以下请求。但我希望在滚动到最后一张图片时调用它。

标题

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="technology.nine.moviedb.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical">

    </android.support.v7.widget.RecyclerView>

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:id="@+id/progress"
        android:visibility="visible"/>

</RelativeLayout>

item_movie.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/item_movie">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/image_view"/>

</LinearLayout>

主要 Activity .java

package technology.nine.moviedb;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ProgressBar;
import android.widget.Toast;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import technology.nine.moviedb.adapter.MovieAdapter;
import technology.nine.moviedb.api.ApiClient;
import technology.nine.moviedb.api.ApiInterface;
import technology.nine.moviedb.model.Movie;
import technology.nine.moviedb.model.MovieResponse;

public class MainActivity extends AppCompatActivity {

    public static final String API_KEY = "9c7b8cc9de4995efcf3705b49f54dca8";
    Boolean isScrolling = false;
    int currentPage = 1;
    int currentItems, totalItems, scrollOutItems;
    RecyclerView recyclerView;
    LinearLayoutManager linearLayoutManager;
    MovieAdapter movieAdapter;
    ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progressBar = (ProgressBar) findViewById(R.id.progress);
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        linearLayoutManager = new LinearLayoutManager(this);
        movieAdapter = new MovieAdapter(R.layout.item_movie, getApplicationContext());
        recyclerView.setAdapter(movieAdapter);
        recyclerView.setLayoutManager(linearLayoutManager);
        fetchData();
    }

    private void fetchData() {
        progressBar.setVisibility(View.VISIBLE);
        Log.i("progress bar", "called");
        ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);
        Call<MovieResponse> call = apiInterface.getTopRatedMovies(API_KEY, currentPage);

        call.enqueue(new Callback<MovieResponse>() {
            @Override
            public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
                List<Movie> movies = response.body().getResults();
                movieAdapter.addAll(movies);

                recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                        super.onScrollStateChanged(recyclerView, newState);
                        if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){
                            isScrolling = true;
                        }
                    }

                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                        super.onScrolled(recyclerView, dx, dy);
                        currentItems = linearLayoutManager.getChildCount();
                        totalItems = linearLayoutManager.getItemCount();
                        scrollOutItems = linearLayoutManager.findFirstVisibleItemPosition();

                        if(isScrolling & (currentItems + scrollOutItems == totalItems)){
                            isScrolling = false;
                            currentPage += 1;
                            fetchData();
                        }
                    }
                });
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onFailure(Call<MovieResponse> call, Throwable t) {
                Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

}

电影适配器.java

package technology.nine.moviedb.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;

import java.util.ArrayList;
import java.util.List;

import technology.nine.moviedb.GlideApp;
import technology.nine.moviedb.R;
import technology.nine.moviedb.api.ApiClient;
import technology.nine.moviedb.model.Movie;

/**
 * Created by Ganesh on 25-02-2018.
 */

public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MovieViewHolder> {

    private List<Movie> movies;
    private int rowLayout;
    private Context context;

    public MovieAdapter(int rowLayout, Context context) {
        movies = new ArrayList<>();
        this.rowLayout = rowLayout;
        this.context = context;
    }

    @Override
    public MovieViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false);
        return new MovieViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MovieViewHolder holder, int position) {
        //holder.title.setText(movies.get(position).getTitle());

        String img_url_path = ApiClient.IMAGE_URL + movies.get(position).getPosterPath();

        GlideApp.with(context)
                .load(img_url_path)
                .override(holder.poster.getWidth(), holder.poster.getHeight())
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
                .into(holder.poster);
    }

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

    public class MovieViewHolder extends RecyclerView.ViewHolder {

        LinearLayout moviesLayout;
        ImageView poster;

        public MovieViewHolder(View v) {
            super(v);
            moviesLayout = (LinearLayout) v.findViewById(R.id.item_movie);
            poster = (ImageView) v.findViewById(R.id.image_view);
        }

    }

    public void addAll(List<Movie> movies) {
        for(Movie m: movies) {
            add(m);
        }
    }

    private void add(Movie m) {
        movies.add(m);
        notifyItemInserted(movies.size() - 1);
    }

}

Github link对于这个项目。

帮我解决这个问题。提前致谢。

最佳答案

一切似乎都很好。尝试修改 onScrolled 函数内的条件,如下所示:

int buffer = 3;//you can modify this accordingly.
if(isScrolling & (scrollOutItem > (totalItems - buffer))){
    //call fetchData();
}

关于android - 在 recyclerview 中将高度设置为 wrap_content 时不显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49333995/

相关文章:

android - Recyclerview水平扑克牌效果

android - 刷新 recyclerview 时出现 NullPointerException

android - [Android]ListView剪切TextView文本

java - 在替换方法或拆分方法中添加多个值

java - 从随机位置沿圆圈移动对象

java - 从 NDK 读取 Settings.Secure -decodeIndirectRef 中的间接引用无效

android - RecyclerView 在 Android 中只显示一行

java - Firebase 数据库总是返回 null

android - 如何在RecyclerView项目中同时创建垂直和水平的layout_weight

java - Android 应用程序因 RecyclerView 而崩溃