0
  • 我设置MaterialTextView在内部RelativeLayoutRelativeLayout以编程方式为每个设备设置不同的大小。

  • 然后我使用ViewTreeObserver设置setMaxLinessetEllipsize输入,MaterialTextView但我面临一些问题,显示MaterialTextView使用 RecyclerView.Adapter 的文本。

  • 我正在使用负载更多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);

        }
    }
}
4

3 回答 3

0

我不完全确定您在那里遇到的问题。但是,我想我在您的代码中发现了一些问题。

我在设置时看到的第一个问题RecyclerView是设置由以下固定的布局大小。

recyclerView.setHasFixedSize(true);

看起来您正在动态更改项目布局大小。因此,您需要在设置RecyclerView.

我看到的第二个问题是,textView_categoryforViewHolder中没有Quote。因此,以下应该引发错误。

quotes.textView_category.setText(subCategoryLists.get(position).getCategory_name());
于 2020-03-21T17:35:16.483 回答
0

我能看到的一个问题是你正在打电话

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

无论如何,在您的侦听器回调的第一行。在 RecyclerView 中,前几次调用布局可能仍然无法测量,但您在第一次回调后取消了侦听器回调。所以这条线会触发,如果视图仍然无法测量,那么接下来的几行将失败,您的代码将没有更多机会填充视图。在取消未来的侦听器回调之前,尝试检查视图的测量宽度或测量高度是否大于 0。

于 2020-03-25T15:09:52.010 回答
0

我用过这个。完美运行

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);
    }
});
于 2020-03-27T04:58:21.017 回答