You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何缩小RecyclerView子项中TextView两行文本间的间距?

解决RecyclerView子项TextView两行文本间距缩小的问题

你当前已经通过lineSpacingExtra和lineSpacingMultiplier调整了行间距,若要进一步缩小,可尝试以下几种方案:

方案一:优化现有样式参数

调整lineSpacingExtra的负值,或配合微调lineSpacingMultiplier,进一步压缩行间距:

<style name="m_ui_medium_02" parent="@android:style/Widget.TextView">
    <item name="android:textSize">12sp</item>
    <!-- 增大负值(如-4dp),注意避免文字过度重叠 -->
    <item name="android:lineSpacingExtra">-4dp</item>
    <!-- 可适当调小multiplier(如0.4),增强压缩效果 -->
    <item name="android:lineSpacingMultiplier">0.4</item>
    <item name="android:textColor">@color/ink_lightest</item>
</style>

注意:负值不能过大,否则会导致上下行文字重叠影响可读性,建议在不同分辨率设备上测试适配效果。

方案二:自定义TextView手动控制行间距

通过重写onDraw方法,直接调整每行文本的绘制位置,灵活性最高:

public class CompactLineSpacingTextView extends androidx.appcompat.widget.AppCompatTextView {
    // 自定义行间距偏移值(单位px,负值为缩小间距)
    private int mExtraLineOffset = -6;

    public CompactLineSpacingTextView(Context context) {
        super(context);
    }

    public CompactLineSpacingTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CompactLineSpacingTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        TextPaint paint = getPaint();
        paint.setColor(getCurrentTextColor());
        paint.drawableState = getDrawableState();

        String text = getText().toString();
        if (text.isEmpty()) {
            super.onDraw(canvas);
            return;
        }

        Layout layout = getLayout();
        float lineHeight = layout.getLineHeight();
        for (int i = 0; i < layout.getLineCount(); i++) {
            float x = layout.getLineLeft(i);
            // 计算每行Y坐标,默认基础上叠加自定义偏移
            float y = layout.getLineTop(i) + getPaddingTop() + (lineHeight - paint.getFontMetrics().bottom + paint.getFontMetrics().top) / 2 - paint.getFontMetrics().top;
            if (i > 0) {
                y += mExtraLineOffset;
            }
            canvas.drawText(text, layout.getLineStart(i), layout.getLineEnd(i), x, y, paint);
        }
    }

    // 提供动态设置偏移值的方法
    public void setExtraLineOffset(int offset) {
        mExtraLineOffset = offset;
        invalidate();
    }
}

布局中使用该自定义TextView:

<your.package.name.CompactLineSpacingTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="@style/m_ui_medium_02"
    android:text="你的两行文本内容"/>

方案三:使用自定义LineHeightSpan

通过SpannableString设置自定义Span,无需修改TextView:

public class CompactLineHeightSpan implements LineHeightSpan {
    private final int mExtraSpacing; // 单位px,负值为缩小间距

    public CompactLineHeightSpan(int extraSpacing) {
        mExtraSpacing = extraSpacing;
    }

    @Override
    public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, Paint.FontMetricsInt fm) {
        fm.bottom += mExtraSpacing;
        fm.descent += mExtraSpacing;
    }
}

代码中给TextView应用该Span:

TextView textView = findViewById(R.id.your_text_view);
String content = "你的两行文本内容";
SpannableString spannableString = new SpannableString(content);
// 传入负值(如-8px),根据需求调整
spannableString.setSpan(new CompactLineHeightSpan(-8), 0, content.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannableString);

额外适配建议

建议使用工具类将dp转为px,保证多设备适配:

public static int dpToPx(Context context, int dp) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}

内容的提问来源于stack exchange,提问作者Priyanka Kadam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:55:20