Как я могу ускорить рендеринг предметов в представлении Recycler, которое принимает навсегда? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть адаптер представления Recycler, который работает.Он просто перечисляет некоторые контакты из уже созданного списка.Дело в том, что ... на их перечисление (или раздувание?) Уходит вечностьПриложение зависает на несколько секунд.Это происходит с телефонами, которые имеют более 600 контактов.Я думал, что это просто ограничения аппаратного обеспечения телефона, но я не испытываю никаких задержек при переходе на собственный список контактов телефона.Тот загружается в долях секунды и является гладким.Я просто мог бы сделать что-то не так здесь.

class ContactAdapter extends RecyclerView.Adapter {
    private final int TYPE_NO_RESULTS = 0;
    private final int TYPE_ITEM_AFFILIATED = 2;
    private final int TYPE_ITEM_NONAFFILIATED = 4;
    private List<ContactData> contacts;

    public ContactAdapter(List<ContactData> contacts) {
        this.contacts = contacts;
    }

    @Override
    public int getItemViewType(int position) {
        if (contacts.size()>0){
            return controller.isSelectedAffiliated() ? TYPE_ITEM_AFFILIATED : TYPE_ITEM_NONAFFILIATED;
        }
        return TYPE_NO_RESULTS;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        RecyclerView.ViewHolder viewHolder = null;
        if (viewType == TYPE_ITEM_AFFILIATED || viewType == TYPE_ITEM_NONAFFILIATED){
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_luka_contact_item, parent, false);
            viewHolder = new ItemViewHolder(view);
        } else if (viewType == TYPE_NO_RESULTS){
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_transfer_contact_empty, parent, false);
            viewHolder = new NoResultsHolder(view);
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        final int type = getItemViewType(position);
        if (type == TYPE_ITEM_AFFILIATED || type == TYPE_ITEM_NONAFFILIATED){
            final ContactData data = getContactInfo(position);
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (controller.isSelectedAffiliated()) {
                        if (position<=contacts.size()){
                            mOnItemSelected.onContactSelected(data);
                        }
                    }

                }
            });
            ((ItemViewHolder)holder).titleView.setText(data.name);

            if (data.url!=null){
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(LukaContactsFragment.this.getContext().getContentResolver(), Uri.parse(data.url));
                    RoundedBitmapDrawable imageDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
                    imageDrawable.setCircular(true);
                    ((ItemViewHolder)holder).imageView.setImageDrawable(imageDrawable);
                } catch (IOException e) {
                    ((ItemViewHolder)holder).imageView.setImageBitmap(defaultImage);
                }
            } else {
                ((ItemViewHolder)holder).imageView.setImageBitmap(defaultImage);
            }

            ((ItemViewHolder) holder).inviteText.setVisibility(View.GONE);
            ((ItemViewHolder) holder).separator.setVisibility(position == contacts.size() || position== getItemCount()?View.INVISIBLE:View.VISIBLE);

        } else {
            ((NoResultsHolder)holder).titleView.setText(getString(R.string.phone_transfer_contacts_no_results_header));
        }

    }

    @Override
    public int getItemCount() {
        int count = 0;
        if (contacts.size()>0){
            count = contacts.size();
        }
        if (count== 0){
            count = 1;
        }
        return count;
    }

    private ContactData getContactInfo(int position) {
        return contacts.get(position);
    }

}

РЕДАКТИРОВАТЬ: Добавление XML

<LinearLayout
            android:id="@+id/listLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/contacts"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/dimen_8"
                android:layout_marginStart="@dimen/dimen_6"
                android:layout_marginEnd="@dimen/dimen_6"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

        </LinearLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...