java - 聊天应用程序的 recyclerview 不显示任何数据或 View

标签 java android android-recyclerview chat retrofit2

嗨,我正在使用 android 构建聊天应用程序 UI,但它运行时不显示任何数据或 View , 我与机器人服务器交互,该服务器应在发送文本后返回文本。我正在对 http 连接使用改造。

显示的模型类是来自 json 的响应

请帮助我并向我询问您想要的任何详细信息

我的适配器

public class MessageListAdapter extends 
RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int VIEW_TYPE_MESSAGE_SENT = 1;
private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;
private List<Messages> data;
private Context mContext;

// constructor
public MessageListAdapter(List<Messages> data, Context mContext) {
    this.data = data;
    this.mContext = mContext;
}


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

    View itemView;

    if (viewType == VIEW_TYPE_MESSAGE_SENT) {


        return new SentMessageHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.user_message, parent, false));
    } else {


        return new RecvdMessageHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.bot_message, parent, false));
    }

}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    int type = getItemViewType(position);

    Messages messages = data.get(position);


    if (type == VIEW_TYPE_MESSAGE_SENT) {


        SentMessageHolder sentMessageHolder = (SentMessageHolder) holder;
        sentMessageHolder.messageBody.setText(messages.getText());

    } else {


        RecvdMessageHolder recvdMessageHolder = (RecvdMessageHolder) holder;
        recvdMessageHolder.messageBody.setText(messages.getText());
    }
}

public int getItemViewType(int position) {

    Messages messages = data.get(position);


    if (messages.getRecipientId() == ("default")) {
        return VIEW_TYPE_MESSAGE_SENT;
    } else
        return VIEW_TYPE_MESSAGE_RECEIVED;

}

@Override
public int getItemCount() {


    if (data != null) {
        return data.size();

    } else return 0;
}

class SentMessageHolder extends RecyclerView.ViewHolder {

    public TextView messageBody;


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

        messageBody = (TextView) itemView.findViewById(R.id.text_message_body);

    }
}

class RecvdMessageHolder extends RecyclerView.ViewHolder {

    public TextView messageBody;

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

        messageBody = (TextView) itemView.findViewById(R.id.text_message_body);

    }
}

我的 Activity

public class MainActivity extends AppCompatActivity {
private EditText editText;
private RecyclerView mMessageRecycler;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter MessageListAdapter;
List<Messages> data;


//init client
Retrofit retrofit = RetrofitClient.getRetrofitClient();
//contact with the interface
APIService apiService = retrofit.create(APIService.class);


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    editText = findViewById(R.id.my_msg);

    data = new ArrayList<>();

    mMessageRecycler = (RecyclerView) findViewById(R.id.reyclerview_message_list);
    MessageListAdapter = new MessageListAdapter(data , this);
   // messageListAdapter.notifyDataSetChanged();
    mMessageRecycler.setAdapter(MessageListAdapter);
    mMessageRecycler.setLayoutManager(new LinearLayoutManager(this));


    mMessageRecycler.setHasFixedSize(true);




}

public void clickedbtn(View view) {
    fetchMessages();

}

private void fetchMessages() {


    Call<List<Messages>> res = apiService.getBotResponse(editText.getText().toString());

        res.enqueue(new Callback<List<Messages>>() {
            @Override
            public void onResponse(Call<List<Messages>> call, Response<List<Messages>> response) {

                List<Messages> messages = response.body();
                data.addAll(messages);//Changed here
                MessageListAdapter.notifyDataSetChanged();//Changed here


                mMessageRecycler.smoothScrollToPosition(messages.size()-1);




            }

            @Override
            public void onFailure(Call<List<Messages>> call, Throwable t) {


            }
        });
    }

我的模型类

public class Messages {

@SerializedName("recipient_id")
@Expose
private String recipientId;
@SerializedName("text")
@Expose
private String text;


public Messages(String text) {
    this.text = text;
}

public String getRecipientId() {
    return recipientId;
}

public void setRecipientId(String recipientId) {
    this.recipientId = recipientId;
}

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

最佳答案

尝试将Adapter实例化RecyclerView.setAdapter()添加到改进的onResponse()中: 像这样:

Call<List<Messages>> res = apiService.getBotResponse(editText.getText().toString());

    res.enqueue(new Callback<List<Messages>>() {
        @Override
        public void onResponse(Call<List<Messages>> call, Response<List<Messages>> response) {

            List<Messages> messages = response.body();
            //Init the Adpater here!!
            MessageListAdapter = new MessageListAdapter(data , this);
            //SetAdapter here!!
            mMessageRecycler.setAdapter(MessageListAdapter);
            data.addAll(messages);//Changed here

            MessageListAdapter.notifyDataSetChanged();//Changed here


            mMessageRecycler.smoothScrollToPosition(messages.size()-1);




        }

        @Override
        public void onFailure(Call<List<Messages>> call, Throwable t) {


        }
    });

编辑:

除了上述内容之外,您的 clickedbtn() 应该如下所示:

public void clickedbtn(View view) {

    Messages msg = new Messages(editText.getText().toString());
    msg.setRecipientId("default");

    data.add(msg);
    MessageListAdapter.notifyDataSetChanged();

    fetchMessages();

}

关于java - 聊天应用程序的 recyclerview 不显示任何数据或 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53327557/

相关文章:

android - 从数据库中成功检索数据但无法通过适配器类

java - 将 Activity 中的数据获取到 RecyclerView 适配器中?

java - Web3j Transfer.sendFunds() 返回错误 "insufficient funds for gas * price + value"

java - 将 "List<SelectItem>"值连接到字符串作为 csv

android - Firebase addValueEventListener 只能工作几个小时

android - 同一列表的多个实例的 DiffUtil

java - 我正在尝试打开对话框,但我不断收到编译错误 `Builder (android.content.Context) in Builder cannot be applied to the Activity

java - Hibernate和mysql超时问题

java - InputMethodManager 如何设置输入法类型?

android - 如何使用flutter阻止用户访问应用程序中的音频文件?