RecyclerView имеет задержку и не прокручивается плавно

Для отображения моих строк в списке я использовал RecyclerViewМои строки большие и персидские, поэтому для красивого интерфейса я хочу показать их оправданными. Для этого я использовал библиотеку Text-Justify. Теперь у меня есть красивый оправданный текст.

НО из-за тяжелого расчета DocumentView (по простому: оправдано TextView) мой RecyclerView не прокручивается плавно и имеет отставание. Поэтому я решил поставить эти расчеты, прежде чем показывать RecyclerView и вместо этого показать прогресс. Итак, я положил setAdapter в AsyncTask и создать DocumentView из моих строк, но во время выполнения я получаю сообщение об ошибке, что мне не разрешено добавлять представление в другой поток вместо основного потока.
Если я установлю ширину и высоту DocumentView что-то постоянное мое RecyclerView свитки очень красиво. Как я могу вычислить ширину и высоту DocumentView в другом потоке, чтобы показать пользователю прогресс при расчете ширины и высоты.

private class myAdapter extends RecyclerView.Adapter<ItemViewHolder> {

    private Context context;
    private List<Item> items;
    private ArrayList<DocumentView> justifiedBodies;

    public ItemAdapter(Context context, List<Item> items){
        this.items = items;
        this.context = context;
        justifiedBodies = new ArrayList<>();
        for(Item item:Items){
            Spanned span = Html.fromHtml(item.getBody());
            justifiedBodies.add(createDocumentView(span, DocumentView.FORMATTED_TEXT));
        }
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.
                from(parent.getContext()).
                inflate(R.layout.my_layout, parent, false);
        return new ItemViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final ItemViewHolder holder, int position) {
        final Item item = items.get(position);


        DocumentView justifiedDocumentView = justifiedBodies.get(position);
        if(justifiedDocumentView.getParent() != null){
            ((ViewGroup)justifiedDocumentView.getParent()).removeView(justifiedDocumentView);
        }
        holder.justifiedBody.removeAllViews();
        holder.justifiedBody.addView(justifiedDocumentView);

    }

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

}

public DocumentView createDocumentView(Spanned article, int type) {
    final DocumentView documentView = new DocumentView(getActivity(), type);
    documentView.getDocumentLayoutParams().setAntialias(true);
    documentView.getDocumentLayoutParams().setHyphenated(false);
    documentView.getDocumentLayoutParams().setMaxLines(100);
    documentView.getDocumentLayoutParams().setOffsetX(10);
    documentView.getDocumentLayoutParams().setOffsetY(10);
    documentView.getDocumentLayoutParams().setTextSubPixel(true);
    documentView.getDocumentLayoutParams().setWordSpacingMultiplier(5.0f);
    documentView.getDocumentLayoutParams().setTextColor(0xff000000);
    documentView.getDocumentLayoutParams().setTextTypeface(ResourceManager.iranTF);
    documentView.getDocumentLayoutParams().setTextSize(23);
    documentView.getDocumentLayoutParams().setTextAlignment(TextAlignment.JUSTIFIED);
    documentView.getDocumentLayoutParams().setInsetPaddingLeft(30f);
    documentView.getDocumentLayoutParams().setInsetPaddingRight(30f);
    documentView.getDocumentLayoutParams().setInsetPaddingTop(30f);
    documentView.getDocumentLayoutParams().setInsetPaddingBottom(30f);
    documentView.getDocumentLayoutParams().setLineHeightMultiplier(1f);
    documentView.getDocumentLayoutParams().setReverse(true);
    documentView.setText(article);

    // I want to calculate width and height and write them here
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(CALCULATED_WIDTH,
            CALCULATED_HEIGHT);
    documentView.setLayoutParams(layoutParams);

    documentView.setCacheConfig(DocumentView.CacheConfig.AUTO_QUALITY);

    return documentView;
}

public static class ItemViewHolder extends RecyclerView.ViewHolder
{
    protected FrameLayout justifiedBody;

    public ItemViewHolder(View itemView) {
        super(itemView);
        justifiedBody = (FrameLayout) itemView.findViewById(R.id.justified_body);
        }
}

И это моя AsyncTask, которая не работает:

class uiDecore extends AsyncTask<String, String, String>{

    private ItemAdapter itemAdapter;
    private ArrayList<Item> items;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressView.start();
    }

    @Override
    protected String doInBackground(String... params) {
        // init Cards
        items = DataSrc.getSelectedItem(); // query from my database
        recyclerView = (RecyclerView) getActivity().findViewById(R.id.cards_recyclerview);
        llm = new LinearLayoutManager(getActivity());
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        // I don't allow this because I'm not in main thread!
        recyclerView.setLayoutManager(llm);
        itemAdapter = new ItemAdapter(getActivity(), items);
        // in run time i get error becuse I allocate a new DocumentView
        recyclerView.setAdapter(itemAdapter);
        recyclerView.setHasFixedSize(true);
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        progressView.stop();
    }
}  

Я называю uiDecore.execute в OnActivityCreated моего фрагмента.

0 ответов

Другие вопросы по тегам