使用 ViewTreeObserver 我在 RecyclerView.Adapter 内的 MaterialTextView 中添加 setMaxLines 和 setEllipsize [英] Using ViewTreeObserver i am adding setMaxLines and setEllipsize in MaterialTextView inside RecyclerView.Adapter

查看:18
本文介绍了使用 ViewTreeObserver 我在 RecyclerView.Adapter 内的 MaterialTextView 中添加 setMaxLines 和 setEllipsize的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  • 我在 RelativeLayout 中设置了 MaterialTextView 并为每个设备以编程方式设置了 RelativeLayout 大小.

  • I am set MaterialTextView inside RelativeLayout and set RelativeLayout size programmatically different size for every device.

然后我使用 ViewTreeObserverMaterialTextView 中设置 setMaxLinessetEllipsize 但我面临一些问题使用 RecyclerView.Adapter 在 MaterialTextView 中显示文本.

Then i have using ViewTreeObserver to set setMaxLines and setEllipsize in MaterialTextView but i am facing some problem show the text in MaterialTextView using RecyclerView.Adapter.

我正在使用加载更多 RecyclerView 我正在获取所有数据,然后在列表中自动显示文本并通知数据适配器然后显示文本.

I am using load more RecyclerView i am getting all data then after show text automatically in list and also notify data adapter then show text.

在列表中的 MaterialTextView 中不显示文本

not showing text inside MaterialTextView in list

手机锁开/关然后在MaterialTextView

在片段中设置recyclerview

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

        }
    }
}

推荐答案

我用过这个.完美运行

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

这篇关于使用 ViewTreeObserver 我在 RecyclerView.Adapter 内的 MaterialTextView 中添加 setMaxLines 和 setEllipsize的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆