Я провожу последние несколько дней по этому вопросу.
Я пытаюсь реализовать приложение чата на основе https://blog.sendbird.com/android-chat-tutorial-building-a-messaging-ui
Почему-то я получаю сообщение об ошибке «адаптер не подключен, пропускается макет». Я считаю, что мой код в активности правильный. Я также знаю, что msgidlist не пуст.
В моем коде я должен увидеть несколько примеров разговоров, основанных на данных json, которые я собираю на URL залпа.
Это выглядит так:
[{"msgid": "280780", "id_from": "2243", "id_to": "5073", "отправитель": "Morgany", "получатель": "Frederic_SmartVibes", "тело": "супер, weer" een testbericht. En weer zonder kusje. Опции 6-летний юбилей nog wel ... "," timestamp ":" 2018-08-17 22:05:06 "," wasread ":" 1 "}, {" msgid ":" 279698 "," id_from ":" 5073 "," id_to ":" 2243 "," sender ":" Frederic_SmartVibes "," receiveer ":" Morgany "," body ":" Dit is een testberichtje gericht aan jou " "," timestamp ":" 2018-08-14 15:42:20 "," wasread ":" 1 "}, {" msgid ":" 280882 "," id_from ":" 5073 "," id_to ":" 2243 "," отправитель ":" Frederic_SmartVibes "," получатель ":" Morgany "," body ":" kus "," timestamp ":" 2018-08-18 01:47:35 "," wasread ":" 1 "}, {" MSGID ":" 298502" , "id_from": "5073", "id_to": "2243", "отправителя": "Frederic_SmartVibes", "приемник": "Morgany", "тело": "IETS liefs "," timestamp ":" 2018-10-17 16:02:32 "," wasread ":" 1 "}, {" msgid ":" 298503 "," id_from ":" 5073 "," id_to ": "2243", "отправитель": "Frederic_SmartVibes", "получатель": "Morgany", "body": "noooo", "timestamp": "2018-10-17 16:02:43", "wasread": " 1" }]
Activitycode:
public class MessageListActivity extends AppCompatActivity {
public RecyclerView mMessageRecycler;
public MessageListAdapter mMessageAdapter;
ArrayList<String> msgidlist = new ArrayList<String>();
RequestQueue rq;
String url, id_from, id_to, msgid, m_from, m_to, mnicksender, mnickreceiver, mbody,mtimestamp, mwasread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message_list);
mMessageRecycler = findViewById(R.id.reyclerview_message_list);
mMessageRecycler.setHasFixedSize(true);
mMessageRecycler.setLayoutManager(new LinearLayoutManager(MessageListActivity.this));
id_to="2243";
id_from="5073";
url = "https://www.someurl.com/somescript.php?id_from="+id_from+"&id_to="+id_to;
rq = Volley.newRequestQueue(this);
sendjsonrequest();
}
public void sendjsonrequest() {
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
// Process the JSON
try{
// Loop through the array elements
for(int i=0;i<response.length();i++){
// Get current json object
JSONObject messages = response.getJSONObject(i);
// Get the current profile (json object) data
msgid = messages.getString("msgid");
m_from = messages.getString("id_from");
m_to = messages.getString("id_to");
mnicksender = messages.getString("sender");
mnickreceiver = messages.getString("receiver");
mbody = messages.getString("body");
mtimestamp = messages.getString("timestamp");
mwasread = messages.getString("wasread");
messageData.setmsgid(msgid);
messageData.setm_from(m_from);
messageData.setm_to(m_to);
messageData.setmnicksender(mnicksender);
messageData.setMnickreceiver(mnickreceiver);
messageData.setBody(mbody);
messageData.setTimestamp(mtimestamp);
messageData.setWasread(mwasread);
msgidlist.add(msgid);
}
}catch (JSONException e){
e.printStackTrace();
}
mMessageAdapter = new MessageListAdapter(MessageListActivity.this, msgidlist);
mMessageRecycler.setAdapter(mMessageAdapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
rq.add(jsonArrayRequest);
}
}
Мой адаптер:
public class MessageListAdapter extends RecyclerView.Adapter {
private static final int VIEW_TYPE_MESSAGE_SENT = 1;
private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;
private Context mContext;
private ArrayList<String> mMessageList;
public String myid = "5073"; //CHANGE THIS
public MessageListAdapter(Context context, ArrayList<String> messageList) {
mContext = context;
mMessageList = messageList;
}
@Override
public int getItemCount() {
return mMessageList.size();
}
// Determines the appropriate ViewType according to the sender of the message.
@Override
public int getItemViewType(int position) {
//UserMessage message = (UserMessage) mMessageList.get(position);
if (messageData.getFrom(position).equals(myid)) {
// If the current user is the sender of the message
return VIEW_TYPE_MESSAGE_SENT;
} else {
// If some other user sent the message
return VIEW_TYPE_MESSAGE_RECEIVED;
}
}
// Inflates the appropriate layout according to the ViewType.
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == VIEW_TYPE_MESSAGE_SENT) {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_message_sent, parent, false);
return new SentMessageHolder(view);
} else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED) {
view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_message_received, parent, false);
return new ReceivedMessageHolder(view);
}
return null;
}
// Passes the message object to a ViewHolder so that the contents can be bound to UI.
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
String message = (String) mMessageList.get(position);
switch (holder.getItemViewType()) {
case VIEW_TYPE_MESSAGE_SENT:
((SentMessageHolder) holder).bind(message);
break;
case VIEW_TYPE_MESSAGE_RECEIVED:
((ReceivedMessageHolder) holder).bind(message);
}
}
private class SentMessageHolder extends RecyclerView.ViewHolder {
TextView messageText, timeText;
SentMessageHolder(View itemView) {
super(itemView);
messageText = (TextView) itemView.findViewById(R.id.text_message_body);
timeText = (TextView) itemView.findViewById(R.id.text_message_time);
}
void bind(String message) {
messageText.setText(messageData.getBody(Integer.parseInt(message)));
// Format the stored timestamp into a readable String using method.
timeText.setText(messageData.getTimestamp(Integer.parseInt(message)));
}
}
private class ReceivedMessageHolder extends RecyclerView.ViewHolder {
TextView messageText, timeText, nameText;
ImageView profileImage;
ReceivedMessageHolder(View itemView) {
super(itemView);
messageText = (TextView) itemView.findViewById(R.id.text_message_body);
timeText = (TextView) itemView.findViewById(R.id.text_message_time);
nameText = (TextView) itemView.findViewById(R.id.text_message_name);
profileImage = (ImageView) itemView.findViewById(R.id.image_message_profile);
}
void bind(String message) {
messageText.setText(messageData.getBody(Integer.parseInt(message)));
// Format the stored timestamp into a readable String using method.
timeText.setText(messageData.getTimestamp(Integer.parseInt(message)));
nameText.setText(messageData.getreceiver(Integer.parseInt(message)));
// Insert the profile image from the URL into the ImageView.
//Utils.displayRoundImageFromUrl(mContext, message.getSender().getProfileUrl(), profileImage);
}
}
}
Владелец сообщения: (получатель сообщения в основном такой же)
class SentMessageHolder extends RecyclerView.ViewHolder {
TextView messageText, timeText, nameText;
ImageView profileImage;
SentMessageHolder(View itemView) {
super(itemView);
messageText = (TextView) itemView.findViewById(R.id.text_message_body);
timeText = (TextView) itemView.findViewById(R.id.text_message_time);
}
void bind(int message) {
messageText.setText(messageData.getBody(message));
// Format the stored timestamp into a readable String using method.
timeText.setText(messageData.getTimestamp(message));
//nameText.setText(message.getSender().getNickname());
// Insert the profile image from the URL into the ImageView.
//Utils.displayRoundImageFromUrl(mContext, message.getSender().getProfileUrl(), profileImage);
}
}
Любая помощь будет принята с благодарностью. (Я совсем новичок в Android Studio)