La primera ronda del desarrollo de aplicaciones Tiedashudong sprint (4)

Escribir en frente

Hoy en día, las funciones de lectura y respuesta a publicaciones se realizan principalmente. Esta función fue concebida a más de las diez de la noche de ayer. Como resultado, cuanto más escribes, más clara es la idea. Muchos tipos de adaptadores no pueden escribir bien. No pude sostenerlo hasta las doce en punto, así que simplemente me fui a dormir. Después de revisar las ideas en la cama, terminé la función en menos de media hora después de levantarme por la mañana para terminar la clase. Esto también me dice que al escribir código, primero debe pensarlo, especialmente al hacer proyectos. Es muy probable que cambiar una función afecte el marco general. Ahora nuestro volumen de código de proyecto también es de dos o tres mil, y los módulos que soy responsable de escribir son menos de mil (principalmente la capa lógica). Si no puedo resolverlo yo mismo, es fácil detectar errores. Por lo tanto, sobre la base de las lecciones de dibujo, continúe haciendo la función de respuesta por la tarde. Escribir código es muy sencillo, pero al final hay un error desconocido. Al final, también se resolvió por razones desconocidas. Blog de sprint del equipo de hoy:
https://www.cnblogs.com/three3/p/12740291.html Hoy es el cuarto día del sprint del equipo. Tómese un descanso mañana y resuelva el pensamiento lógico general. En caso de que haya un error fatal al final.

Captura de pantalla de funciones

Hoy es principalmente para realizar la publicación y la publicación de respuesta, como se muestra

en la figura: hay una función de comentario en la parte inferior del área de comentarios, después de ingresar el contenido, haga clic en responder para responder a la publicación.

Lógica de implementación lógica posterior

El primero es leer la función de publicación. Aquí se utiliza un RecyclerView de entradas múltiples. La lógica de implementación es similar a la de RecyclerView ordinario. Primero definimos una clase para almacenar el contenido de cada entrada:

public class PostAndRepost {
    private int type;
    private ItemBean post;
    private ItemBeanRepost reposts;
}

El código de ItemBeanRepost es el siguiente:

public class ItemBeanRepost {
    private String name;
    private String content;
    private String posttime;
}

Después de lo más crítico, tenemos que configurar el adaptador:

package com.androidlearing.tdtreehole.adapter;

import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.androidlearing.tdtreehole.R;
import com.androidlearing.tdtreehole.pojo.Post;
import com.androidlearing.tdtreehole.pojo.PostAndRepost;
import com.androidlearing.tdtreehole.pojo.Repost;

import org.w3c.dom.Text;

import java.util.List;

/**
 * @ProjectName: TDTreeHole
 * @Package: com.androidlearing.tdtreehole.adapter
 * @ClassName: PostAndRepostAdapter
 * @Description: 看帖模块的适配器
 * @Author: 武神酱丶
 * @CreateDate: 2020/4/19 23:02
 * @UpdateUser: 更新者
 * @UpdateDate: 2020/4/19 23:02
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
public class PostAndRepostAdapter extends RecyclerView.Adapter {
    private static final String TAG = "PostAndRepostAdapter";
    //定义两个List变量
    private final List<PostAndRepost> mData;
    //定义两个常量标识,因为有两种类型
    public static final int TYPE_POST_CONTENT = 0;
    public static final int TYPE_REPOST_CONTENT = 1;
    //使用构造方法获得数据
    public PostAndRepostAdapter(List<PostAndRepost> data){
        this.mData = data;
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //这里去创建ViewHolder
        View view;
        if(viewType == TYPE_POST_CONTENT){
            view = View.inflate(parent.getContext(), R.layout.item_repost_postcontent,null);
            return new PostContentViewHolder(view);
        }else{
            view = View.inflate(parent.getContext(),R.layout.item_repost_repostcontent,null);
            return new RepostContentViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        //根据条目类型绑定数据
        if(holder instanceof PostContentViewHolder){
            PostContentViewHolder postContentViewHolder = (PostContentViewHolder) holder;
            postContentViewHolder.mUsername.setText(mData.get(position).getPost().getUsername());
            postContentViewHolder.mPostContent.setText(mData.get(position).getPost().getContent());
            postContentViewHolder.mPostTime.setText(mData.get(position).getPost().getPosttime());
        }else if(holder instanceof RepostContentViewHolder){
            RepostContentViewHolder viewHolder = (RepostContentViewHolder) holder;
            viewHolder.mRepostUsername.setText(mData.get(position).getReposts().getName());
            viewHolder.mRepostTime.setText(mData.get(position).getReposts().getPosttime());
            viewHolder.mRepostContent.setText(mData.get(position).getReposts().getContent());

        }
    }
    //这里返回条目数量
    @Override
    public int getItemCount() {
        return mData.size();
    }
    //复写该方法来根据条件取得条目种类
    @Override
    public int getItemViewType(int position) {
        PostAndRepost postAndRepost = mData.get(position);
        if(postAndRepost.getType() ==TYPE_POST_CONTENT){
            return TYPE_POST_CONTENT;
        }else{
            return TYPE_REPOST_CONTENT;
        }
    }

    private class PostContentViewHolder extends RecyclerView.ViewHolder {

        private final TextView mUsername;
        private final TextView mPostContent;
        private final TextView mPostTime;

        public PostContentViewHolder(View view) {
            super(view);
            //找到控件
            mUsername = view.findViewById(R.id.user_name_tv);
            mPostTime = view.findViewById(R.id.post_time_tv);
            mPostContent = view.findViewById(R.id.post_content_tv);
        }
    }

    private class RepostContentViewHolder extends RecyclerView.ViewHolder {


        private final TextView mRepostUsername;
        private final TextView mRepostTime;
        private final TextView mRepostContent;

        public RepostContentViewHolder(View view) {
            super(view);
            //找到控件
            mRepostUsername = view.findViewById(R.id.repost_user_name_tv);
            mRepostTime = view.findViewById(R.id.reposts_content_time_tv);
            mRepostContent = view.findViewById(R.id.reposts_content_tv);
        }
    }

}

La clave aquí es sobrescribir el método GetItemType para obtener nuestro propio tipo de elemento y luego configurar la vista y el InnerHolder de acuerdo con los diferentes tipos de elementos.
Después de configurar el adaptador, el resto es simple. Pasamos el ID y otra información de la publicación a través de la Intención a la actividad de publicación, y luego leemos la información de respuesta correspondiente a la publicación y finalmente mostramos todas las publicaciones.

Lógica de implementación de la función de respuesta

Para lograr la función de respuesta, primero debemos tener un diseño de diseño. Después de verificar la información aquí, descubrí que se puede lograr agregando una vista de pie a RecyclerView. Pero los controles nativos no incluyen esta característica. Por lo tanto, el xRecyclerView que encapsula esta función se utiliza para la implementación. También incluye la encapsulación de carga desplegable, actualización desplegable, etc. Después de agregar el diseño, podemos implementar el evento de clic (aquí encontré un ERROR muy sangriento, mi evento de clic de botón no se pudo activar. Estuve molesto por N durante mucho tiempo, y finalmente me di cuenta al cambiar una forma, pero EditText no pudo Fue monitoreado. Después de mostrar el código a los compañeros de equipo, el problema se resolvió temporalmente. Este puede ser el problema de la superposición de enfoque). El código específico es el siguiente:

    public void TestRepost(View view){
        Log.d(TAG,"onClick...");
        mContent = mRepostContent.getText().toString();
        int postid = mPostForSelf.getPostid();
        Log.d(TAG,"content =="+mContent);
        //设置日期格式
        DateFormat dateFormat = DateFormat.getDateInstance(2);
        //获取当前时间
        String publishtime =dateFormat.format(new Date());
        //简单的判空处理
        if (TextUtils.isEmpty(mContent)) {
            Toast.makeText(RepostActivity.this,"请输入回复内容!",Toast.LENGTH_SHORT).show();
            return;
        }
        final Repost repost = new Repost();
        repost.setPostid(postid);
        repost.setContent(mContent);
        repost.setPublishtime(publishtime);
        //暂时使用测试数据,等登录注册模块做好后Intent传值过来
        repost.setUserid(1);
        //去插入数据
        insertRepost(repost);
    }

El código para buscar datos e insertar datos ya no se coloca; de lo contrario, el blog es demasiado largo.

Resumen

Esta vez aprendí mucho escribiendo código. Por ejemplo, debes ordenar tus pensamientos antes de escribir el código. Por ejemplo, no intentes resolverlo todo el tiempo cuando encuentres un error. También es necesario un descanso oportuno. En resumen, Sprint aprendió mucho. Vamos Ollie!

Supongo que te gusta

Origin www.cnblogs.com/wushenjiang/p/12741016.html
Recomendado
Clasificación