使用 RecyclerView Android 加载列表中存在的所有数据

Load all data present in the list using RecyclerView Android

我正在使用 RecyclerView 显示 list 中的数据。 但是 RecyclerView 只加载用户可见的行数据。

因为我的 list 只有 10-12 个项目,我想一次加载所有项目。 如何使用 RecyclerView 来处理这个问题?

RecyclerViewFragment.java

public class RecyclerViewFragment extends Fragment {
List<Movie> movieList = new ArrayList<>();

RecyclerView myRecyclerView;
MyMovieAdapter myMovieAdapter;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.reccycler_view_frament,container,false);

    Movie movie = new Movie("ABC","1-1-1");
    movieList.add(movie);
    movie = new Movie("PLK","4-4-4");
    movieList.add(movie);
    movie = new Movie("XYZ","2-2-2");
    movieList.add(movie);
    movie = new Movie("ZMMD","3-3-3");
    movieList.add(movie);
    movie = new Movie("ABC","1-1-1");
    movieList.add(movie);
    movie = new Movie("PLK","4-4-4");
    movieList.add(movie);
    movie = new Movie("XYZ","2-2-2");
    movieList.add(movie);
    movie = new Movie("ZMMD","3-3-3");
    movieList.add(movie);
    movie = new Movie("ABC","1-1-1");
    movieList.add(movie);
    movie = new Movie("PLK","4-4-4");
    movieList.add(movie);
    movie = new Movie("XYZ","2-2-2");
    movieList.add(movie);
    movie = new Movie("ZMMD","3-3-3");
    movieList.add(movie);
    movie = new Movie("ABC","1-1-1");
    movieList.add(movie);
    movie = new Movie("PLK","4-4-4");
    movieList.add(movie);
    movie = new Movie("XYZ","2-2-2");
    movieList.add(movie);
    movie = new Movie("ZMMD","3-3-3");
    movieList.add(movie);
    movie = new Movie("ABC","1-1-1");
    movieList.add(movie);
    movie = new Movie("PLK","4-4-4");
    movieList.add(movie);
    movie = new Movie("XYZ","2-2-2");
    movieList.add(movie);
    movie = new Movie("ZMMD","3-3-3");
    movieList.add(movie);
    movie = new Movie("ABC","1-1-1");
    movieList.add(movie);
    movie = new Movie("PLK","4-4-4");
    movieList.add(movie);
    movie = new Movie("XYZ","2-2-2");
    movieList.add(movie);
    movie = new Movie("ZMMD","3-3-3");
    movieList.add(movie);
    movie = new Movie("ABC","1-1-1");
    movieList.add(movie);
    movie = new Movie("PLK","4-4-4");
    movieList.add(movie);
    movie = new Movie("XYZ","2-2-2");
    movieList.add(movie);
    movie = new Movie("ZMMD","3-3-3");
    movieList.add(movie);


    myRecyclerView = view.findViewById(R.id.recyclerView);
    myMovieAdapter = new MyMovieAdapter(movieList);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    myRecyclerView.setLayoutManager(layoutManager);
    myRecyclerView.setItemAnimator(new DefaultItemAnimator());
    myRecyclerView.setAdapter(myMovieAdapter);

    return view;
  }
}

MyMovieAdapter.java

public class MyMovieAdapter extends RecyclerView.Adapter<MyMovieAdapter.MyMoviewHolder> {

List<Movie> movieList;

public MyMovieAdapter(List<Movie> movieList){
    this.movieList = movieList;
}

@NonNull
@Override
public MyMoviewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.movie_adapter,viewGroup,false);
    return new MyMoviewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyMoviewHolder myMoviewHolder, int i) {

    Log.d("MOVIETEST","NAME = "+movieList.get(i).getMovieName());
    myMoviewHolder.movieNameTV.setText(movieList.get(i).getMovieName());
    myMoviewHolder.movieReleaseDateTV.setText(movieList.get(i).getReleaseDate());
}

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

public class MyMoviewHolder extends RecyclerView.ViewHolder{

    AppCompatTextView movieNameTV, movieReleaseDateTV;

    public MyMoviewHolder(@NonNull View itemView) {
        super(itemView);
        movieNameTV = itemView.findViewById(R.id.name);
        movieReleaseDateTV = itemView.findViewById(R.id.release_date);
    }
}

}

Movie.java

public class Movie {

private String movieName;
private String releaseDate;

public Movie(String movieName, String releaseDate){
    this.movieName = movieName;
    this.releaseDate = releaseDate;
}
public String getMovieName() {
    return movieName;
}

public void setMovieName(String movieName) {
    this.movieName = movieName;
}

public String getReleaseDate() {
    return releaseDate;
}

public void setReleaseDate(String releaseDate) {
    this.releaseDate = releaseDate;
}

}

movie_adapter.xml

<android.support.v7.widget.CardView
android:elevation="3dp"
android:background="#9372"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="50dp"
xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:weightSum="10"
        android:layout_gravity="center_vertical"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.AppCompatTextView
            android:layout_width="0dp"
            android:layout_weight="5"
            android:layout_height="wrap_content"
            android:id="@+id/name"
            android:gravity="center_horizontal"
            android:layout_gravity="center_horizontal"
            android:text="ABC"
            />
        <android.support.v7.widget.AppCompatTextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/release_date"
            android:layout_weight="5"
            android:gravity="center_horizontal"
            android:layout_gravity="center_horizontal"
            android:text="1-1-1"
            />

    </LinearLayout>

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

请更新代码,我所做的唯一小改动是将高度从 50 dp 更改为 wrap_content

    <android.support.v7.widget.CardView
    android:elevation="3dp"
    android:background="#9372"
    android:layout_marginTop="10dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android">

        <LinearLayout
            android:weightSum="10"
            android:layout_gravity="center_vertical"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.AppCompatTextView
                android:layout_width="0dp"
                android:weight="5"
                android:layout_height="wrap_content"
                android:id="@+id/name"
                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:text="ABC"
                />
            <android.support.v7.widget.AppCompatTextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:id="@+id/release_date"
android:weight="5"

                android:gravity="center_horizontal"
                android:layout_gravity="center_horizontal"
                android:text="1-1-1"
                />

        </LinearLayout>

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

update your card View

recyclerView 的整个想法是加载用户可见的内容,如果你想显示 10-12 项并一次加载它们,你可以使用 listView(顺便说一句,它是 RecyclerView 的祖先)。

您可以使用的另一个选项 - 您可以使用滚动布局并将项目动态添加到布局中或在运行前在布局中声明它们(我建议使用滚动布局,因为不同的手机具有不同的屏幕尺寸,并且如果没有滚动布局,您可能会发现在某些设备中,视图无法适合屏幕并且不会显示在屏幕上)。

如果你不想使用滚动布局 - 你总是可以使用约束布局 - 但是如果你想在 1 个屏幕上显示 10-12 个项目请注意每个项目不会有很多屏幕尺寸(您的布局可能看起来非常压缩并且对用户来说不直观)