代码之家  ›  专栏  ›  技术社区  ›  Hews

向适配器添加新数据会影响初始值

  •  2
  • Hews  · 技术社区  · 6 年前

    我正在尝试建立一个简单的聊天界面。当用户单击 Enter(输入) 时,他们的消息将发送到服务器,添加到数据库,同时插入到客户端设备上的 messageadapter(适配器) 中,使其显示在屏幕上。

    来自用户的消息是右对齐的,对于非用户则是右对齐的。

    当用户发送消息时,与所有消息向上移动一个位置相反,文本向上移动,但不是实际的消息对象。

    我正在尝试让用户发送一条消息,并且所有以前的消息都有效地向上移动,以便新消息可以出现在下面。

    最初,非用户消息是 hello 但是在我发送用户消息之后,非用户下面的消息, hey 取代了它。

    这是我对 messageadapter的代码

    public class messageadapter extends recyclerview.adapter<recyclerview.viewholder>。{
    
    list<message>data=collections.emptylist();
    list<integer>message_type=collections.emptylist();
    
    //创建构造函数以初始化从MainActivity发送的上下文和数据
    public messageadapter(列表<message>数据,列表<integer>消息类型){
    this.data=数据;
    this.message_type=message_type;
    }
    
    public void additem(message item,int message_type){
    
    添加(项);
    this.message_type.add(0,message_type);
    
    }
    
    //在创建视窗夹时展开布局
    @覆盖
    public recyclerview.viewholder oncreateviewholder(viewgroup viewgroup,int i){
    开关(一){
    案例0:
    view v=layoutInflator.from(viewGroup.getContext()).inflat(r.layout.message_non_user,viewGroup,false);
    返回新的视点0(v);
    案例2:
    view q=layoutInflator.from(viewGroup.getContext()).inflat(r.layout.message_user,viewGroup,false);
    返回新的viewholder1(q);
    }
    view v=layoutInflator.from(viewGroup.getContext()).inflat(r.layout.message_non_user,viewGroup,false);
    返回新的视窗保持器1(v);
    }
    
    //绑定数据
    @覆盖
    public void onbindViewholder(recyclerview.viewholder Viewholder,final int position){
    开关(viewholder.getItemViewType()){
    案例0:
    viewholder0 viewholder0=(viewholder0)viewholder;
    message current0=data.get(位置);
    viewholder0.body.settext(current0.message);
    断裂;
    
    案例2:
    viewholder1 viewholder1=(viewholder1)viewholder;
    message current1=data.get(位置);
    viewholder1.body.settext(当前1.message);
    断裂;
    }
    }
    
    //返回列表中的合计项
    @覆盖
    public int getItemCount()。{
    返回data.size();
    }
    
    @覆盖
    公共int GetItemViewType(int位置){
    int temp=消息类型get(位置);
    如果(温度==0){
    返回0;
    }
    返回2;
    
    }
    类ViewHolder0扩展RecyclerView.ViewHolder{
    
    文本查看正文;
    
    公共视图保持器0(最终视图项视图){
    super(项目视图);
    body=(textview)itemview.findview byid(r.id.message_body);
    }
    }
    
    类ViewHolder1扩展RecyclerView.ViewHolder{
    
    文本查看正文;
    
    公共视图保持器1(最终视图项视图){
    super(项目视图);
    body=(textview)itemview.findview byid(r.id.message_body);
    
    }
    }
    }
    

    然后这是用于发送消息操作的代码。

    message user_input=new message();
    user_input.message=chat_input.getText().toString();
    messageadapter.additem(用户输入,0);
    
    messageadapter.notifyItemInserted(messageadapter.getItemCount()+1);
    
    messagesrecycleView.scrollToposition(messageadapter.getItemCount()-1);
    messageadapter.notifyDataSetChanged();
    chat_input.getText().clear();
    
    
    

    感谢您的帮助:)MessageAdapter在客户机的设备上,所以它会出现在他们的屏幕上。

    来自用户的消息是右对齐的,对于非用户则是右对齐的。

    当用户发送消息时,与所有消息向上移动一个点相反,文本向上移动,但不是实际的消息对象。

    我正在尝试让用户发送一条消息,所有以前的消息都有效地向上移动,以便新消息显示在下面。

    Original message structure

    Post-message sent structure

    最初,非用户消息是Hello但是在我发送用户的消息之后,非用户下面的消息,Hey取代它。

    这是我的代码消息适配器:

    public class MessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
    List<Message> data= Collections.emptyList();
    List<Integer> message_type= Collections.emptyList();
    
    // create constructor to initialize context and data sent from MainActivity
    public MessageAdapter(List<Message> data, List<Integer> message_type) {
        this.data=data;
        this.message_type=message_type;
    }
    
    public void addItem(Message item, int message_type){
    
        this.data.add(item);
        this.message_type.add(0, message_type);
    
    }
    
    // Inflate the layout when ViewHolder created
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        switch (i) {
            case 0:
                View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message_non_user, viewGroup, false);
                return new ViewHolder0(v);
            case 2:
                View q = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message_user, viewGroup, false);
                return new ViewHolder1(q);
        }
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message_non_user, viewGroup, false);
        return new ViewHolder1(v);
    }
    
    // Bind data
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
        switch (viewHolder.getItemViewType()) {
            case 0:
                ViewHolder0 viewHolder0 = (ViewHolder0)viewHolder;
                Message current0 = data.get(position);
                viewHolder0.body.setText(current0.message);
                break;
    
            case 2:
                ViewHolder1 viewHolder1 = (ViewHolder1)viewHolder;
                Message current1 = data.get(position);
                viewHolder1.body.setText(current1.message);
                break;
        }
    }
    
    // return total item from List
    @Override
    public int getItemCount() {
        return data.size();
    }
    
    @Override
    public int getItemViewType(int position) {
        int temp = message_type.get(position);
        if(temp == 0 ){
            return 0;
        }
        return 2;
    
    }
    class ViewHolder0 extends RecyclerView.ViewHolder {
    
        TextView body;
    
        public ViewHolder0(final View itemView) {
            super(itemView);
            body = (TextView) itemView.findViewById(R.id.message_body);
        }
    }
    
    class ViewHolder1 extends RecyclerView.ViewHolder {
    
        TextView body;
    
        public ViewHolder1 (final View itemView) {
            super(itemView);
            body = (TextView) itemView.findViewById(R.id.message_body);
    
        }
    }
    }
    

    这就是send-message action:

     Message user_input = new Message();
     user_input.message = chat_input.getText().toString();
     messageAdapter.addItem(user_input, 0);
    
     messageAdapter.notifyItemInserted(messageAdapter.getItemCount()+1);
    
     MessagesRecyclerview.scrollToPosition(messageAdapter.getItemCount() - 1);
     messageAdapter.notifyDataSetChanged();
     chat_input.getText().clear();
    

    感谢您的帮助:)

    1 回复  |  直到 6 年前
        1
  •  1
  •   fatemeh fallahi arezoudar    6 年前

    this.data.add(item);
    this.message_type.add(0, message_type);
    

    this.data.add(0,item);
    this.message_type.add(0, message_type); 
    

    this.data.add(item);
    this.message_type.add(message_type);