Expansão dinâmica e função de dobramento de imitação de WeChat Moments Android

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.

Acho que você gosta

Origin blog.csdn.net/A_Intelligence/article/details/85004712
Recomendado
Clasificación