RecyclerView with 100 items loading too slow

好久不见. 提交于 2020-01-07 05:14:07

问题


I have used RecyclerView several times before, but it is the first time that it is working too slow.

In this case, the items are represented by a simple LinearLayout with 3 views inside it:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/linearLayout"
    android:orientation="horizontal"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/tvTicketNumber"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:gravity="center"
        android:padding="8dp"/>
    <EditText
        android:id="@+id/etTotalSold"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:padding="8dp"
        android:gravity="center" />
    <TextView
        android:id="@+id/tvSurplus"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:padding="8dp"
        android:layout_height="match_parent"
        android:gravity="center"/>
</LinearLayout>

The RecyclerView uses the previous layout in its adapter:

public class TicketAdapter extends RecyclerView.Adapter<TicketAdapter.ViewHolder> {
    private ArrayList<Ticket> dataSet;

    // Define references to the views for each data item
    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView tvTicketNumber, tvSurplus;
        public EditText etQuantity;

        public ViewHolder(View v) {
            super(v);

            tvTicketNumber = (TextView) v.findViewById(R.id.tvTicketNumber);
            etQuantity = (EditText) v.findViewById(R.id.etQuantity);
            tvSurplus = (TextView) v.findViewById(R.id.tvSurplus);
        }
    }

    public TicketAdapter() {
        dataSet = new ArrayList<>();
    }

    public void setDataSet(ArrayList<Ticket> dataSet) {
        this.dataSet = dataSet;
    }

    private String twoDigits(final int i) {
        final String pre = (i<=9 ? "0" : "");
        return pre + i;
    }

    @Override
    public TicketAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {

        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.table_row, parent, false);


        // set the view's size, margins, padding and layout parameters

        return new ViewHolder(v);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // get element from the data set
        Ticket ticket = dataSet.get(position);

        // replace the contents of the view with that element
        holder.tvTicketNumber.setText(twoDigits(position));
        holder.tvSurplus.setText("6");
    }

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

Before, I was using TableLayout with TableRows created programmatically, but I have read that layout have to be used for a defined number of rows in XML.

I have to load a list of 100 items in a fragment. But it takes approximately 4 seconds to load. For that reason I wrote some logic to show a progressBar and next hide it and show the scrollView (the recycler is within it).

The fragmentTransaction was still slow, so I moved the code to the onViewCreated method. The transaction was still slow and I added an AsyncTask. With this last change, the transaction is faster, but the progressBar looks stopped all the time and the buttons can't be used (the onPostExecute is taking 4 seconds to load and show the recyclerView).

I want to show the animation of the progressBar, but the onPostExecute is executed in the UI thread and all the app is stopped for 4 seconds while the RecyclerView is loading.

Please give me some ideas. Before I have used items with images loaded from internet, and the RecyclerView was working faster. It is too strange.

来源:https://stackoverflow.com/questions/41945734/recyclerview-with-100-items-loading-too-slow

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!