mit-cml / appinventor-sources

MIT App Inventor Public Open Source
http://appinventor.mit.edu/appinventor-sources/
Apache License 2.0
1.47k stars 2.05k forks source link

Performance issues in RecyclerView based ListView #2857

Open ewpatton opened 1 year ago

ewpatton commented 1 year ago

Describe the bug

From the forum: The RecyclerView based ListView seems to have performance degradation for large lists.

Affects

Expected behavior

Switching to the RecyclerView should have had better performance than the default ListView implementation. We need to investigate this regression.

Steps to reproduce

  1. Create a ListView and populate it with a few thousand elements.
Khushipatil13 commented 1 year ago

here's a step-by-step solution to address the performance degradation issue with the RecyclerView based ListView in your Android app:

Update the project dependencies to include the RecyclerView support library. You can do this by adding the following line to your app's build.gradle file:

arduino implementation 'com.android.support:recyclerview-v7:28.0.0'

Replace the ListView in the layout file with a RecyclerView. This can be done by replacing the tag with and adding the necessary attributes to configure the RecyclerView's layout and behavior.

Create a new RecyclerView adapter class that extends RecyclerView.Adapter. This adapter will be responsible for creating and binding the views for each item in the list.

Implement the getItemCount() and onBindViewHolder() methods in your adapter. The getItemCount() method should return the number of items in your list, while the onBindViewHolder() method should bind the data for each item to the views in the layout.

Replace the getView() method in your adapter with a new ViewHolder class that extends RecyclerView.ViewHolder. This ViewHolder will hold references to the views in the layout and provide a way to efficiently retrieve and update the views for each item.

Use the ViewHolder to inflate a layout for each item and bind data to the views in the layout. This can be done in the onCreateViewHolder() method of your adapter, where you can inflate the layout for each item and create a new instance of the ViewHolder to hold the views.

Set the adapter on the RecyclerView in your activity or fragment using the setAdapter() method. This will attach the adapter to the RecyclerView and display the list of items in the layout.

Optimize your adapter code to handle large datasets efficiently. This can be done by implementing view recycling, which involves reusing the ViewHolder and its views instead of creating new ones for each item in the list.

Test your app thoroughly to ensure that the RecyclerView based ListView is performing as expected. You can use profiling tools such as Android Profiler to monitor the app's performance and identify any remaining performance issues.

By following these steps, you should be able to address the performance degradation issue with the RecyclerView based ListView in your Android app and provide a smoother, more responsive user experience.

SusanRatiLane commented 1 year ago

@Khushipatil13 Can you identify specifically where in our code changes need to be made? Keep in mind that we don't use gradle.

patryk84a commented 7 months ago

Perhaps this PR will solve this problem: #3099