Función de expansión dinámica y plegado de imitar WeChat Moments Android

Escribir al frente

Si el texto es demasiado largo para expandirse y contraerse, mi idea original es juzgar la cantidad de líneas de contenido de texto a través del método getLineCount () de TextView y luego expandir o contraer de esta manera. De hecho, cuando se llama a este método, el número de líneas obtenidas por getLineCount es siempre 0 cuando la vista no está completamente dibujada. Este problema se puede resolver utilizando observadores para monitorear La siguiente es la operación específica.

Establecer el número máximo de filas mostradas

Según los requisitos de PM, establezca el número máximo de líneas en 5 líneas:

		<!-- 内容 -->
                <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" />

A través de android: maxLines = "5"
android: ellipsize = "end", todo el mundo sabe esto, así que no hablaré de ello.

Crear observador

Cree un observador de TextView responsable de la visualización del contenido en el Adaptador

// 创建观察者,dynamicContent是负责内容展示的TextView
ViewTreeObserver viewTreeObserver = holder.dynamicContent.getViewTreeObserver();

Luego, a través del observador para monitorear, para evitar que el observador monitoree las llamadas repetidas, por lo que debe eliminar

viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                // 避免Observer监听重复调用,移除掉
                ViewTreeObserver observer = holder.dynamicContent.getViewTreeObserver();
                observer.removeOnGlobalLayoutListener(this);
                // 在这里编写你需要的收起或展开的代码
                code...
            }
        });

Luego, utilizo el método getLineCount en el monitoreo anterior para determinar si expandir o contraer la operación

 		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);
                }

El número máximo de filas después de la expansión que establecí anteriormente es de 50 filas.
De esta manera, la función de desplegarse o retraerse puede realizarse mediante el seguimiento por parte del observador.
E isPack se utiliza para marcar el estado actual de expansión o contracción.

// 判断展开或收起
    private boolean isPack = false;

Pega el bloque 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);
                }
            }
        });

Escribir al final

El proyecto está a punto de terminar. Registra los problemas encontrados durante el proceso. En cuanto a las funciones de expansión y colapso de este círculo de amigos de imitación, lo hice hace mucho tiempo, y olvidé a qué blogs de los grandes dioses me refería en el tiempo, y referido a algunos blogs y artículos en Internet., Puede haber similitudes, lo siento.

Supongo que te gusta

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