Escreva na frente
Se o texto for muito longo para expandir e recolher, minha ideia original é julgar o número de linhas do conteúdo do texto por meio do método getLineCount () de TextView e, em seguida, expandir ou recolher dessa maneira. Na verdade, quando esse método é chamado, o número de linhas obtidas por getLineCount é sempre 0 quando a visualização não está completamente desenhada. Este problema pode ser resolvido usando observadores para monitorar.A seguir está a operação específica.
Defina o número máximo de linhas exibidas
De acordo com os requisitos do PM, defina o número máximo de linhas para 5 linhas:
<!-- 内容 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:minHeight="30dp"
android:textColor="@color/menuFont"
android:textSize="16sp"
android:maxLines="5"
android:ellipsize="end" />
<!-- 展开或收起 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
android:text="@string/pack_down"
android:textColor="@color/colorPrimaryDark"
android:textSize="16sp"
android:visibility="gone" />
Por meio do android: maxLines = "5"
android: ellipsize = "end", todo mundo sabe disso, então não vou falar sobre isso.
Criar observador
Crie um observador do TextView responsável pela exibição do conteúdo no Adaptador
// 创建观察者,dynamicContent是负责内容展示的TextView
ViewTreeObserver viewTreeObserver = holder.dynamicContent.getViewTreeObserver();
Então, através do observador para monitorar, a fim de evitar que o observador monitore chamadas repetidas, então você precisa remover
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// 避免Observer监听重复调用,移除掉
ViewTreeObserver observer = holder.dynamicContent.getViewTreeObserver();
observer.removeOnGlobalLayoutListener(this);
// 在这里编写你需要的收起或展开的代码
code...
}
});
Então, eu uso o método getLineCount no monitoramento acima para determinar se devo expandir ou recolher a operação
if (holder.dynamicContent.getLineCount() >= 5) {
holder.packTV.setVisibility(View.VISIBLE);
// 全文/收起
holder.packTV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!isPack){
// 当前为默认状态False(内容处于收起状态),点击后文本按钮变成收起(内容处于展开状态)
holder.packTV.setText(R.string.pack_up);
isPack = true;
holder.dynamicContent.setMaxLines(50);
} else {
// 点击后文本按钮变成展开(内容处于收起状态)
holder.packTV.setText(R.string.pack_down);
isPack = false;
holder.dynamicContent.setMaxLines(5);
}
}
});
} else {
holder.packTV.setVisibility(View.GONE);
}
O número máximo de linhas após a expansão que defini acima é de 50 linhas.
Desta forma, a função de desdobramento ou retração pode ser realizada pelo monitoramento do observador.
E isPack é usado para marcar o estado atual de expansão ou recolhimento.
// 判断展开或收起
private boolean isPack = false;
Cole o bloco de código completo
// 获取TextView的文本内容行数,大于5行就显示全文展示,因为在View没有完全绘制的时候,所有的TextView的文本长度都是0,使用观察者去监听可以解决
ViewTreeObserver viewTreeObserver = holder.dynamicContent.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// 避免Observer监听重复调用,移除掉
ViewTreeObserver observer = holder.dynamicContent.getViewTreeObserver();
observer.removeOnGlobalLayoutListener(this);
if (holder.dynamicContent.getLineCount() >= 5) {
holder.packTV.setVisibility(View.VISIBLE);
// 全文/收起
holder.packTV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!isPack){
// 当前为默认状态False(内容处于收起状态),点击后文本按钮变成收起(内容处于展开状态)
holder.packTV.setText(R.string.pack_up);
isPack = true;
holder.dynamicContent.setMaxLines(50);
} else {
// 点击后文本按钮变成展开(内容处于收起状态)
holder.packTV.setText(R.string.pack_down);
isPack = false;
holder.dynamicContent.setMaxLines(5);
}
}
});
} else {
holder.packTV.setVisibility(View.GONE);
}
}
});
Escreva no final
O projeto está prestes a terminar. Registre os problemas encontrados durante o processo. Em relação às funções de expansão e colapso desse círculo de imitação de amigos, eu fiz há muito tempo, e esqueci a quais blogs dos grandes deuses me referia no tempo, e referiu-se a alguns blogs e artigos na Internet., Pode haver semelhanças, desculpe.