【问题标题】:What is the Best way to handle a lot of data on a Recycleview在 Recycleview 上处理大量数据的最佳方法是什么
【发布时间】:2017-06-05 15:04:49
【问题描述】:

我需要在RecycleView 上加载一长串数据(5000-1000),RecycleView 的每一项都有很多细节,所以 5 个TextView,1 个ImageView 和一个ProgressBar .所有数据都存储在SQLite DB。 加载包含所有数据并将其设置到适配器的ArrayList<Object> 更好还是在适配器上加载数据更好? 请考虑我在适配器上还有其他事情要做,比如检索图像(使用Glide)。 任何建议或考虑都会有所帮助!

谢谢

【问题讨论】:

    标签: android sqlite android-recyclerview adapter


    【解决方案1】:

    您可以尝试仅显示部分数据,并在用户到达回收站视图的末尾(基本上是分页)时使用Recycler View's OnScroll Listener 加载和显示更多数据。这样一来,您就不必支付一次加载所有数据的全部负载。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      如果您使用回收器视图,那么我想这实际上是加载大型列表的最佳方法(对我来说)...我认为这两种方法(存储 Arraylist 并将数据发送到适配器)在某些情况下都有效,但回收器view 销毁已滚动的数据。但我认为许多开发人员使用的最好和最有效的方法是设置一次显示在屏幕上的数据量的限制,然后使用滚动侦听器加载更多,然后回收器视图也可以工作!

      看这里很完美

      Android Endless List

      【讨论】:

        【解决方案3】:

        你可以试试 cursorRecyclarViewAdapter

        https://gist.github.com/skyfishjy/443b7448f59be978bc59

        public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.ViewHolder> {
        
        // Because RecyclerView.Adapter in its current form doesn't natively 
        // support cursors, we wrap a CursorAdapter that will do all the job
        // for us.
        CursorAdapter mCursorAdapter;
        
        Context mContext;
        
        public MyRecyclerAdapter(Context context, Cursor c) {
        
            mContext = context;
        
            mCursorAdapter = new CursorAdapter(mContext, c, 0) {
        
                @Override
                public View newView(Context context, Cursor cursor, ViewGroup parent) {
                    // Inflate the view here
                }
        
                @Override
                public void bindView(View view, Context context, Cursor cursor) {
                    // Binding operations
                }
            };
        }
        
        public static class ViewHolder extends RecyclerView.ViewHolder {
            View v1;
        
            public ViewHolder(View itemView) {
                super(itemView);
                v1 = itemView.findViewById(R.id.v1);
            }
        }
        
        @Override
        public int getItemCount() {
            return mCursorAdapter.getCount();
        }
        
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            // Passing the binding operation to cursor loader
            mCursorAdapter.getCursor().moveToPosition(position); //EDITED: added this line as suggested in the comments below, thanks :)
            mCursorAdapter.bindView(holder.itemView, mContext, mCursorAdapter.getCursor());
        
        }
        
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // Passing the inflater job to the cursor-adapter
            View v = mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent);
            return new ViewHolder(v);
        }
        }
        

        【讨论】:

        • 谢谢!我试试看:-)
        【解决方案4】:

        您可以通过 Android Room & Paging 组件来实现这一点 我已经尝试加载数据记录数>10m

        public class MainActivity extends AppCompatActivity {
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        
                ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
                binding.setViewModel(new ViewModelProvider(this).get(ViewModel.class));
                binding.setLifecycleOwner(this);
            }
        
        
            public static class ViewModel extends AndroidViewModel {
                public final List<Contact> contactList = new ArrayList<>();
                private final ContactDatabase database = Room.databaseBuilder(getApplication(), ContactDatabase.class, "contact.db")
                        .fallbackToDestructiveMigration()
                        .allowMainThreadQueries()
                        .build();
                public final LiveData<PagedList<Contact>> pagedListLiveData = new LivePagedListBuilder<>(database.getContactDao().getAllContact3(), 1000).build();
        
                public ViewModel(@NonNull Application application) {
                    super(application);
                }
            }
        }
        

        房间数据库实体类

        @Entity
        public class Contact {
        
            @PrimaryKey(autoGenerate = true)
            public int _id;
        
            public int _accountId;
        
            public int photo_id;
        
            public String display_name;
            public String display_name_alt;
            public String display_name_source;
        
            public int starred;
            public int pinned;
        
            public String phonetic_name;
            public String phonetic_name_style;
        
            public int deleted;
            public int dirty;
        }
        

        房间数据库道

        @Dao
        public interface ContactDao {
        
            @Query("SELECT * FROM contact")
            List<Contact> getAllContact();
        
            @Query("SELECT * FROM contact")
            LiveData<List<Contact>> getAllContact2();
        
            @Insert
            void insertAll(List<Contact> contacts);
        
            @Query("SELECT * FROM contact")
            DataSource.Factory<Integer, Contact> getAllContact3();
        
            @Query("SELECT * FROM contact")
            PositionalDataSource<Contact> getAllContact4();
        
        }
        

        布局

        <?xml version="1.0" encoding="utf-8"?>
        <layout>
        
            <data>
        
                <variable
                    name="viewModel"
                    type="com.xxx.hugedatabaserecordtest.MainActivity.ViewModel" />
            </data>
        
            <androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">
        
                <androidx.recyclerview.widget.RecyclerView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical"
                    app:itemTemplate="@{@layout/contact_list_item_template}"
                    app:items="@{viewModel.pagedListLiveData}"
                    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
        
            </androidx.constraintlayout.widget.ConstraintLayout>
        </layout>
        

        【讨论】:

          猜你喜欢
          • 2018-08-30
          • 1970-01-01
          • 2014-03-12
          • 1970-01-01
          • 1970-01-01
          • 2019-09-19
          • 2019-03-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多