【问题标题】:recyclerview for chat app doesn't show any data or views聊天应用程序的 recyclerview 不显示任何数据或视图
【发布时间】:2019-04-19 00:49:09
【问题描述】:

您好,我正在使用 android 构建聊天应用程序 UI,但它运行时没有显示任何数据或视图, 我与发送文本后应该返回文本的机器人服务器交互。我正在为 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);

    }
}

我的活动

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

【问题讨论】:

  • 您正在使用一个空的 List 初始化 MessageListAdapter,因为您在数据从服务器返回之前添加了 MessageListAdapter = new MessageListAdapter(data , this);
  • 尝试在您的onResponse 中添加mMessageRecycler.setAdapter(MessageListAdapter);
  • 我的评论有帮助吗?
  • @HudiIlfeld 仍然没有显示任何视图,我这样做 MessageListAdapter = new MessageListAdapter(data , this);假设从构造函数传递我的模型。我是 recyclerview 的新手。它可能有逻辑错误,但我不知道在哪里

标签: java android android-recyclerview chat retrofit2


【解决方案1】:

尝试将both 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();

}

【讨论】:

  • 如果有帮助请告诉我:)
  • 我尝试从构造函数中删除上下文 public MessageListAdapter(List data) { this.data = data;并做了你的回答,现在的问题是它只对收到的消息有效,它显示收到的消息的视图,但用户消息没有显示为视图
  • 你为什么要删除上下文?
  • bc MessageListAdapter = new MessageListAdapter(data , this);没用,并要求我将上下文类型更改为回调改造类型我试过了,但是当我吃午饭时应用程序崩溃了,所以我删除了它
  • 没有。你应该输入如下MessageListAdapter = new MessageListAdapter(data , MainActivity.this);,因为你是从匿名类[即回调]中引用一个类成员,this关键字只是引用内部类,因此你需要添加MainActivity.this 为了让 Java 了解您所指的上下文
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2019-10-15
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
相关资源
最近更新 更多