java - Recyclerview 不会对大型数据集进行动画处理

标签 java android animation android-recyclerview android-animation

我正在制作一个应用程序,其中有几个电影屏幕,其中一个是从 IMDB 有史以来排名前 250 的电影列表的爬虫中加载的。我试图在卡片加载时实现动画,但无济于事。最终我将问题范围缩小到数据集太大这一事实。当我将变量 loadHowMany 更改为 25 或更少时,动画加载正常。我是否必须实现某种无限滚动功能,或者有没有办法为这个大型数据集设置动画?

Top250Activity.java

public class Top250Activity extends BaseActivity {

    private RecyclerView mListView;
    JSONArray array;
    Movie[] searchResults;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_top250);

        mListView = findViewById(R.id.top250list);
        mListView.setNestedScrollingEnabled(false);


        try {
            getResults(new Runnable() {
                @Override
                public void run() {

                    final MovieCardAdapter adapter = new MovieCardAdapter(getApplicationContext(), searchResults);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            LinearLayoutManager lLayout;

                            mListView.setNestedScrollingEnabled(false);
                            Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.item_animation_fall_down);
                            mListView.setAnimation(animation);
                            lLayout = new GridLayoutManager(Top250Activity.this, 2);
                            mListView.setHasFixedSize(true);
                            mListView.setLayoutManager(lLayout);
                            mListView.setAdapter(adapter);

                        }
                    });

                }
            });

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private void getResults(final Runnable runnable) throws JSONException {
        final String apiKey = #######;
        final int loadHowMany = 100;
        String theURL = "https://api.morph.io/btrav528/imdb-top-250/data.json?key=#############&query=select%20*%20from%20%22data%22%20limit%20" + loadHowMany;
        final OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(theURL).build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                final String jsonData = response.body().string();

                JSONObject results;

                try {
                    array = new JSONArray(jsonData);
                    searchResults = new Movie[array.length()];
                    for (int i = 0; i < array.length(); i++) {
                        JSONObject jsonResult = array.getJSONObject(i);
                        final Movie movie = new Movie();

                        String html = jsonResult.getString("name");
                        String title = Html.fromHtml(html).toString();
                        movie.setTitle(title);
                        movie.setYear(jsonResult.getString("year"));
                        Uri uri = Uri.parse(jsonResult.getString("link"));
                        String path = uri.getPath();
                        Log.d("taggie", path);
                        String[] segments = uri.getPath().split("/");
                        String idStr = segments[segments.length-1];
                        Log.d("taggieidstr", idStr);

                        String posterUrl = "http://img.omdbapi.com/?i=" + idStr + "&h=600&apikey=" + apiKey;

                        movie.setPosterURL(posterUrl);
                        movie.setImdbID(idStr);

                        searchResults[i] = movie;
                    }
                    runnable.run();

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

item_animation_fall_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:duration="@integer/config_shortAnimTime">

    <translate
        android:fromYDelta="-20%"
        android:toYDelta="0"
        android:interpolator="@android:anim/decelerate_interpolator"
        />

    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"
        android:interpolator="@android:anim/decelerate_interpolator"
        />

    <scale
        android:fromXScale="105%"
        android:fromYScale="105%"
        android:toXScale="100%"
        android:toYScale="100%"
        android:pivotX="50%"
        android:pivotY="50%"
        android:interpolator="@android:anim/decelerate_interpolator"
        />

</set>

最佳答案

我认为最好通过无限滚动来实现它。 一个有用的链接: https://camposha.info/source/android-sqlite-recyclerview-infiniteendless-paginationload-serverside

关于java - Recyclerview 不会对大型数据集进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50421108/

相关文章:

java - 如何禁用 Java 应用程序中另一个应用程序打开的文件的文件锁定

使用 Android L 最新支持 v4 的 Android Activity 转换

javascript - 如何使图像旋转?

javascript - D3 中的国际象棋走法

java - 使用 Java 的 RIJNDAEL 加密

java - Java 中的文本文件读取和打印

android - 在 Android Chrome 上禁用同源策略

iphone - iOS - 如何在两个 View 之间创建自定义过渡?

java - 使用 Java 将 Flex 与 Blazeds 集成的问题

android - 读取我对象中设置的所有数据