Android RecyclerView滚动时,TextView MeasuredHeight无法正确计算

这可能是关于stackoverflow中的Android RecyclerView的最常见问题,但是我找不到任何适合我需求的合适解决方案。

我的问题

我正在使用带有Room Database和Retrofit的分页库在Recyclerview中填充内容。有两个VIEW_TYPE;一个是卡片视图中的实际数据,另一个是进度条布局,当调用API来获取下一组数据时,该进度条布局显示在Recyclerview的底部。列表中的每个卡片视图都很复杂,包含图像和文本。

一切正常,直到内容混乱时我开始向上滚动。确切地说,一个textview必须基于另一个textView的测量高度来显示。上下滚动后,测得的高度无法正确显示。图片截图如下所示

我发现了几乎所有建议的2种解决方案。

  1. 在适配器中覆盖getItemViewType(int position)并返回位置

    〜我无法使用此解决方案,因为我必须保留2个VIEW_TYPES。我的getItemViewType代码如下:

    public int getItemViewType(int position) { if (hasExtraRow() && position == getItemCount() - 1) { return R.layout.item_network_state; } else { return R.layout.card_post_timeline; } }

  2. 在ViewHolder中使用 setIsRecyclable(false)

〜如果我使用此解决方案可以解决我的问题,但我不想使用它,因为这样做会破坏Recyclerview的全部目的,并且在有大量数据集时会严重影响性能。

我的代码

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getcontext());
        if (viewType == R.layout.card_post_timeline) {
            View view = layoutInflater.inflate(R.layout.card_post_timeline,parent,false);
            TimelinePostViewHolder viewHolder = new TimelinePostViewHolder(view,context,optionsSelected );
            return viewHolder;
        } else if (viewType == R.layout.item_network_state) {
            View view = layoutInflater.inflate(R.layout.item_network_state,false);
            return new NetworkStateItemViewHolder(view);
        } else {
            throw new IllegalArgumentException("unknown view type");
        }
    }

public void onBindViewHolder(RecyclerView.ViewHolder holder,int position) {
        switch (getItemViewType(position)) {
            case R.layout.card_post_timeline:
                ((TimelinePostViewHolder) holder).bindTo(getItem(position)); // Data binding happens here
                break;
            case R.layout.item_network_state:
                ((NetworkStateItemViewHolder) holder).bindView(networkState);
                break;
        }
    }`

问题

我们可以使用什么替代方法来解决这个古老的Recyclerview问题?

已更新-

唯一的问题是“显示更多” textview可见性由postBody textview测量的高度来计算。向下滚动然后向上滚动,无论文本内容如何,​​Textview的测量高度总是相同的。

与以下逻辑相同:

private void renderPostContent(Post post) {
        tvPostBody.fromHtml(post.getPostContent());
        Log.d(StringConstants.LOG_TAG,tvPostBody.getText().toString());
        int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(IntegerConstants.SCREEN_WIDTH,View.MeasureSpec.AT_MOST);
        int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
        tvPostBody.measure(widthMeasureSpec,heightMeasureSpec);
        int measuredTextViewHeight = tvPostBody.getMeasuredHeight();
        Log.d(StringConstants.LOG_TAG,"list position - " + getadapterPosition() + " measuredHeight - " + measuredTextViewHeight);
        if (measuredTextViewHeight > IntegerConstants.SCREEN_WIDTH) {
            tvPostBody.setMaxHeight(IntegerConstants.SCREEN_WIDTH);
            tvShowMore.setVisibility(View.VISIBLE);
            // setIsRecyclable(false);
            Log.d(StringConstants.LOG_TAG,"ShowMore visibile");
        } else {
            tvPostBody.setMaxHeight(IntegerConstants.SCREEN_WIDTH);
            tvShowMore.setVisibility(View.GONE);
            //setIsRecyclable(true);
            Log.d(StringConstants.LOG_TAG,"ShowMore gone");
        }
    }
diamondzvn 回答:Android RecyclerView滚动时,TextView MeasuredHeight无法正确计算

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2516539.html

大家都在问