如何在添加新项目后刷新RecclerView,请注意,我正在使用集线器连接从后端发送和接收消息,并且我try 使用notifyItemRangeChanged刷新RecclerView,但它不起作用. 下面是适配器类:

    public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.ViewHolder> {

    public static final int MSG_TYPE_LEFT = 0;
    public static final int MSG_TYPE_RIGHT = 1;

    public static int i = 0;

    private Context mContext;
    private List<Chat> mChat;
    private String imageurl;

    public MessageAdapter(Context mContext, List<Chat> mChat, String imageurl) {
        this.mContext = mContext;
        this.mChat = mChat;
        this.imageurl = imageurl;
    }

    @NonNull
    @Override
    public MessageAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        if(viewType == MSG_TYPE_RIGHT){
            View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_right, parent, false);
            return new MessageAdapter.ViewHolder(view);
        }else{
            View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_left, parent, false);
            return new MessageAdapter.ViewHolder(view);
        }

    }

    @Override
    public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder holder, int position) {
        Chat chat = mChat.get(position);

        holder.show_message.setText(chat.getMessage());
        holder.profile_image.setImageResource(R.mipmap.ic_launcher);

        holder.setItem_on_click_listener(new item_on_click_listener() {
            @Override
            public void onClick(View view, int position, boolean isLongClick) {
                Toast.makeText(mContext, "Clicked", Toast.LENGTH_LONG).show();
            }
        });

    }

    @Override
    public int getItemCount() {
        return mChat.size();
    }

    public  class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{

        public TextView show_message;
        public ImageView profile_image;

        private item_on_click_listener item_on_click_listener;

        public ViewHolder(View itemView) {
            super(itemView);

            show_message = itemView.findViewById(R.id.show_message);
            profile_image = itemView.findViewById(R.id.profile_image);

        }

        public void setItem_on_click_listener(item_on_click_listener item_on_click_listener){
            this.item_on_click_listener = item_on_click_listener;
        }

        @Override
        public void onClick(View view) {
            item_on_click_listener.onClick(view, getAdapterPosition(), false);
            
        }

        @Override
        public boolean onLongClick(View view) {
            item_on_click_listener.onClick(view, getAdapterPosition(), false);
            
            return true;
        }
    }

    @Override
    public int getItemViewType(int position) {
        i = position;
        if(mChat.get(position).getSender() == "Sender Name"){
            return MSG_TYPE_RIGHT;
        }
        else{
            return MSG_TYPE_LEFT;
        }

        
    }

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        recyclerView.refreshDrawableState();
    }

}

下面是Main-Activity类:

public class MainActivity extends AppCompatActivity {

    Button sendBtn;
    ArrayList<String> messagesList = new ArrayList<>();


    HubConnection hubConnection;
    EditText edt_text;
    TextView txt_received;

    MessageAdapter messageAdapter;
    List<Chat> mChat;
    RecyclerView recyclerView;

  
    public void readMessages(String sender, String receiver, String message){
        Chat chat = new Chat(sender, receiver, message);
        mChat.add(chat);
        messageAdapter = new MessageAdapter(MainActivity.this, mChat, "default");
        recyclerView.setAdapter(messageAdapter);
        messageAdapter.notifyItemRangeChanged(messageAdapter.getItemCount(), mChat.size());
       
    }

    @SuppressLint("WrongThread")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
      
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        mChat = new ArrayList<>();


        messageAdapter = new MessageAdapter(MainActivity.this, mChat, "default");
        recyclerView.setAdapter(messageAdapter);

        sendBtn = findViewById(R.id.send_btn);
        edt_text = findViewById(R.id.edt_text);

        try {
            hubConnection = HubConnectionBuilder.create("URL").build();
            hubConnection.start();
            AtomicReference<String> state = new AtomicReference<>("");
            hubConnection.start().subscribe(() -> {
                        state.set("Connect");
                    },
                    error -> {
                        state.set("error");
                    });

            hubConnection.on("SendMessage", (param1, param2, param3, param4) -> {
           
            readMessages("Sender Name", "Receiver Name", "Message");

            }, String.class, String.class, String.class, Integer.class);
            
        }
        catch (Exception e){
            String exMessage = e.getMessage();
        }


        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    if(edt_text.getText().toString().length() > 0){
                        if(hubConnection.getConnectionState() == HubConnectionState.DISCONNECTED){
                            hubConnection.start();
                        }
                        
                        hubConnection.send("Method Name", "param1", "param2", "param3", "param4");
                       
                        hubConnection.on("ReceiveMessage", (param1, param2, param3 , param4) -> {
                                                     
                            
                            readMessages("Sender Name", "Receiver Name", "Message");

                        }, String.class, String.class, String.class, Integer.class);
                        
                    }
                    else{
                        edt_text.setHint("Can not be empty");
                    }

                }catch (Exception ex){
                    String message ;
                    message = ex.getMessage();
                }
            }
        });

    }
 }

有谁能帮帮我吗?

推荐答案

如果您在相同的Adapter实例或任何其他Notify方法中添加/删除数据,则notifyItemRangeChanged将起作用.这里的问题是,您每次都在readMessages方法中创建一个新的Adapter.

只创建一次适配器,并根据需要通知它.因为您已经在onCreate中创建了messageAdapter,所以可以使用相同的实例.

 public void readMessages(String sender, String receiver, String message){
    Chat chat = new Chat(sender, receiver, message);
    mChat.add(chat);
    messageAdapter.notifyItemRangeChanged(messageAdapter.getItemCount(), mChat.size());
   
}

Java相关问答推荐

Java Streams在矩阵遍历中的性能影响

OpenJDK、4K显示和文本质量

当一个链表中间有一个循环时,它的松散部分会发生什么?

SQlite for Android无法使用json_group_array/json_object

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

JUnit—如何模拟局部变量对象方法调用

Character::Emoji不支持带数字的字符吗?

流迭代列表<;对象>;上的NoSuchElementException

AssertJ Java:多条件断言

如何在Java中从XML中获取特定的 node ,然后将其删除?

Spring Security不允许加载js

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

没有使用Lombok生成的参数

如何以编程方式保存workBench.xmi?

具有多个分析模式的复杂分隔字符串的正则表达式

Java递归泛型是否可以被视为继承和重写的语法糖

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

java构造函数中的冻结操作何时发生?

为什么 Random() 的行为不符合预期?

如何在Java中立即显示ProgressBar对话框?