RecyclerView有100个项目加载太慢

时间:2017-01-30 21:30:38

标签: android android-asynctask android-recyclerview progress-bar

之前我曾多次使用RecyclerView,但这是第一次工作太慢。

在这种情况下,项目由简单的LinearLayout表示,其中包含3个视图:

<?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>

RecyclerView使用其适配器中的先前布局:

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();
    }
}

之前,我正在使用TableLayout以编程方式创建TableRows,但我已经读过,布局必须用于XML中已定义的行数。

我必须在片段中加载100个项目的列表。但加载大约需要4秒钟。出于这个原因,我写了一些逻辑来显示progressBar,然后隐藏它并显示scrollView(回收器在其中)。

fragmentTransaction仍然很慢,所以我将代码移到onViewCreated方法。 事务仍然很慢,我添加了一个AsyncTask。通过最后一次更改,事务更快,但progressBar看起来一直停止,并且无法使用按钮(onPostExecute需要4秒才能加载并显示recyclelerView)。

我想显示progressBar的动画,但是onPostExecute在UI线程中执行,所有应用程序在RecyclerView加载时停止了4秒。

请给我一些想法。在我使用从互联网上加载图像的项目之前,RecyclerView工作得更快。太奇怪了。

0 个答案:

没有答案