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
моего фрагмента.