Используя ViewTreeObserver, я добавляю setMaxLines и setEllipsize в MaterialTextView внутри RecyclerView.Adapter - PullRequest
0 голосов
/ 21 марта 2020
  • Я установил MaterialTextView внутри RelativeLayout и установил RelativeLayout размер программно разного размера для каждого устройства.

  • Тогда я использую ViewTreeObserver установить setMaxLines и setEllipsize в MaterialTextView, но я столкнулся с некоторой проблемой, показать текст в MaterialTextView с помощью RecyclerView.Adapter.

  • Я использую load more RecyclerView я получаю все данные, затем автоматически показываю текст в списке, а также уведомляю адаптер данных, затем показываю текст.

  • не отображается текст внутри MaterialTextView в списке

  • блокировка телефона вкл. / Выкл. С отображением данных в MaterialTextView

установка рециркуляции в фрагменте

recyclerView = view.findViewById(R.id.recyclerView_sub_category);
recyclerView.setHasFixedSize(true);
final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);

код адаптера

public class SubCategoryAdapter extends RecyclerView.Adapter {

    private final int VIEW_TYPE_LOADING = 0;
    private final int VIEW_TYPE_ITEM = 1;
    private final int VIEW_TYPE_QUOTES = 2;

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_ITEM) {
           other data load
        } else if (viewType == VIEW_TYPE_QUOTES) {
            View v = LayoutInflater.from(activity).inflate(R.layout.quotes_adapter, parent, false);
            return new Quotes(v);
        } else if (viewType == VIEW_TYPE_LOADING) {
            progressbar load
        }
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, @SuppressLint("RecyclerView") final int position) {

        if (holder.getItemViewType() == VIEW_TYPE_ITEM) {

            final ViewHolder viewHolder = (ViewHolder) holder;

            // ------------- code -----

        } else if (holder.getItemViewType() == VIEW_TYPE_QUOTES) {

            final Quotes quotes = (Quotes) holder;

            quotes.relativeLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, columnWidth / 2));

            Typeface typeface = Typeface.createFromAsset(activity.getAssets(), "text_font/" + subCategoryLists.get(position).getQuote_font());
            quotes.textView.setTypeface(typeface);

            quotes.textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {

                    quotes.textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    int noOfLinesVisible = quotes.textView.getHeight() / quotes.textView.getLineHeight();

                    quotes.textView.setMaxLines(noOfLinesVisible);
                    quotes.textView.setEllipsize(TextUtils.TruncateAt.END);

                    quotes.textView.setText(subCategoryLists.get(position).getStatus_title());
                }
            });


        }
    }

    @Override
    public int getItemCount() {
        return subCategoryLists.size() + 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (position != subCategoryLists.size()) {
            if (subCategoryLists.get(position).getStatus_type().equals("quote")) {
                return VIEW_TYPE_QUOTES;
            } else {
                return VIEW_TYPE_ITEM;
            }
        } else {
            return VIEW_TYPE_LOADING;
        }
    }

    public class Quotes extends RecyclerView.ViewHolder {

        private RelativeLayout relativeLayout;
        private MaterialTextView textView;

        public Quotes(@NonNull View itemView) {
            super(itemView);

            textView = itemView.findViewById(R.id.textView_quotes_adapter);
            relativeLayout = itemView.findViewById(R.id.rel_quotes_adapter);

        }
    }
}

Ответы [ 3 ]

0 голосов
/ 25 марта 2020

Одна проблема, которую я вижу, это то, что вы звоните

quotes.textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

в первой строке вашего обратного вызова слушателя, несмотря ни на что. В RecyclerView первые несколько раз это называется макетом, который все еще не измерен, но вы отменяете обратный вызов слушателя после первого обратного вызова. Таким образом, эта строка запускается, и если представление все еще не измерено, то следующие несколько строк потерпят неудачу, и у вашего кода больше не будет возможности заполнить представление. Попробуйте проверить значение измеренной ширины или измеренной высоты вашего просмотра на значение, превышающее 0, прежде чем отменять обратные вызовы будущих слушателей.

0 голосов
/ 27 марта 2020

Я использую это. отлично работает

textView.setText(subCategoryLists.get(position).getStatus_title());
textView.post(new Runnable() {
    @Override
    public void run() {
        ViewGroup.LayoutParams params = textView.getLayoutParams();
        if (params == null) {
            params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        }
        final int widthSpec = View.MeasureSpec.makeMeasureSpec(textView.getWidth(), View.MeasureSpec.UNSPECIFIED);
        final int heightSpec = View.MeasureSpec.makeMeasureSpec(textView.getHeight(), View.MeasureSpec.UNSPECIFIED);
        textView.measure(widthSpec, heightSpec);
        textView.setMaxLines(heightSpec / textView.getLineHeight());
        textView.setEllipsize(TextUtils.TruncateAt.END);
    }
});
0 голосов
/ 21 марта 2020

Я не совсем уверен в проблеме, которая у вас там есть. Тем не менее, я думаю, что нашел некоторые проблемы в вашем коде.

Первая проблема, с которой я сталкиваюсь при настройке RecyclerView, - это установка размера макета, установленного следующим образом.

recyclerView.setHasFixedSize(true);

Похоже, вы динамически меняете размер макета элемента. Следовательно, вам нужно удалить строку выше при настройке RecyclerView.

Вторая проблема, которую я вижу, заключается в том, что в 1011 * для Quote нет textView_category. Следовательно, следующее должно выдать ошибку.

quotes.textView_category.setText(subCategoryLists.get(position).getCategory_name());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...