简体   繁体   中英

recyclerview for chat app doesn't show any data or views

Hi I'm building chat app UI with android but it runs without showing any data or views, I interact with a bot server that should return text after I send a text. I'm using retrofit for http connections.

the model class showing are the response from json

please help me and ask me any details you want

My adapter

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

    }
}

My 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) {


            }
        });
    }

My model class

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

Try adding both the instantiation of the Adapter and the RecyclerView.setAdapter() to the retrofit onResponse() : Like this:

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) {


        }
    });

EDIT:

In addition to the above, your clickedbtn() should look like this:

public void clickedbtn(View view) {

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

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

    fetchMessages();

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM