1

Я пытаюсь создать систему обмена сообщениями в приложении для Android. Когда пользователь переходит в фрагмент сообщения, мне нужно заполнить список сообщений предыдущим сообщением. Из того, что я прочитал, лучший способ сделать это - с помощью адаптера.Обновление спискаПросмотр через пользовательский адаптер во фрагменте

Вот мой адаптер сообщений

public class MessageAdapter extends ArrayAdapter<message> { 
private final MessagesFragment context; 
private final int layoutResourceId; 
private final ArrayList<message> messages; 

public MessageAdapter(MessagesFragment messagesFragment, int layoutResourceId, ArrayList<message> messages) { 
    super(null, layoutResourceId); 
    this.context = messagesFragment; 
    this.layoutResourceId = layoutResourceId; 
    this.messages = messages; 

} 
@Override 
public View getView(int i, View convertView, ViewGroup viewGroup) { 
    View row = convertView; 
    ViewHolder holder = null; 
    int direction = messages.get(i).userType; 
    //show message on left or right, depending on if 
    //it's incoming or outgoing 

    if (row == null) { 
     LayoutInflater inflater = ((MessagesFragment)context).getLayoutInflater(); 

     int res = 0; 
     if (direction == DIRECTION_INCOMING) { 
      res = R.layout.message_right; 
     } else if (direction == DIRECTION_OUTGOING) { 
      res = R.layout.message_left; 
     }  
     convertView = inflater.inflate(res, viewGroup, false); 
     holder = new ViewHolder(); 
     holder.txtMessage = (TextView) convertView.findViewById(R.id.txtMessage); 
     holder.txtDate = (TextView) convertView.findViewById(R.id.txtDate); 
     row.setTag(holder); 
    } 

    holder.txtMessage.setText(messages.get(i).message); 
    holder.txtDate.setText(messages.get(i).time); 

    return row; 
} 

static class ViewHolder 
{ 
    TextView txtMessage; 
    TextView txtDate; 
} 

}

Я называю это в моем onCreateView в моем фрагменте.

 // Generates all of the messages 
    ArrayList<message> messages = getMessages; 
    View messagesView = inflater.inflate(R.layout.messages, container, false); 
    ListView listView = (ListView)messagesView.findViewById(R.id.listMessages); 
    listView.setAdapter(new MessageAdapter(MessagesFragment.this, R.id.listMessages, messages)); 
    ... 

Мое приложение сбой при вводе фрагмента. Я взял кусочки кода примера и применил к моему приложению, но я не могу заставить его работать. Любые советы или очевидные ошибки я не вижу?

+0

не могли бы вы положить журнал аварий? и изменить «super (null, layoutResourceId)»; to "super (messagesFragment.getActivity(), layoutResourceId);" – Rami

ответ

0

Похоже, что у вас есть неправильный вариант вашего дизайна - у вас есть приложение MessageAdapter, в котором используется фрагмент. Вместо этого ваша деятельность должна создавать и использовать ваш фрагмент и в вашем фрагменте, создавать экземпляр вашего адаптера и делать все, что он должен делать, например. извлекать данные из сообщения, заполнить свой список. Итак, контекст вашей деятельности передается вашему фрагменту - затем используйте тот же контекст для перехода в конструктор вашего пользовательского адаптера.

+0

Ну, это в моем Фрагменте. Моя активность вызывает мой фрагмент, а в oncreate в Fragment я пытаюсь установить адаптер в listView. Что я должен передать в свой адаптер? Руководство, которое я прочитал из [здесь] (http://stackoverflow.com/questions/20985668/is-there-a-way-to-update-multiple-textview-with-arrayadapter), переходит в контекст, который является активностью. Я изменил его на свой фрагмент, и затмение предложило мне изменить его на свой MessageFragment. – confusedProgrammer

0

в вашем фрагменте изменение:

listView.setAdapter(new MessageAdapter(MessagesFragment.this, R.id.listMessages, messages)); 

в

listView.setAdapter(new MessageAdapter(MessagesFragment.this.getActivity(), R.id.listMessages, messages)); 

в вашем адаптер изменения:

private final MessagesFragment context; 

    public MessageAdapter(MessagesFragment messagesFragment, int layoutResourceId, ArrayList<message> messages) { 
     super(null, layoutResourceId); 
     this.context = messagesFragment; 
     this.layoutResourceId = layoutResourceId; 
     this.messages = messages; 
} 

в

private final Context context; 

public MessageAdapter(Context context, int layoutResourceId, ArrayList<message> messages) { 
     super(context, layoutResourceId); 
     this.context = context; 
     this.layoutResourceId = layoutResourceId; 
     this.messages = messages; 
} 
+0

Я получаю сообщение об ошибке из изменения фрагмента. В частности, MessagesFragment.getActivity(). – confusedProgrammer

+0

Исправлено с помощью getActivity(); Он работает, но все еще падает. – confusedProgrammer

+0

@confusedПрограммировать сообщение об авариях пожалуйста – Rami

0
public class MessageAdapter extends ArrayAdapter<message> { 
private final MessagesFragment context; 
private final int layoutResourceId; 
private final ArrayList<message> messages; 

public MessageAdapter(MessagesFragment messagesFragment, int layoutResourceId, ArrayList<message> messages) { 
    super(null, layoutResourceId); 
    this.context = messagesFragment; 
    this.layoutResourceId = layoutResourceId; 
    this.messages = messages; 

} 
@Override 
public View getView(int i, View convertView, ViewGroup viewGroup) { 
    View row = convertView; 
    ViewHolder holder = null; 
    int direction = messages.get(i).userType; 
    //show message on left or right, depending on if 
    //it's incoming or outgoing 

    if (row == null) { 
     LayoutInflater inflater = ((MessagesFragment)context).getLayoutInflater(); 

     int res = 0; 
     if (direction == DIRECTION_INCOMING) { 
      res = R.layout.message_right; 
     } else if (direction == DIRECTION_OUTGOING) { 
      res = R.layout.message_left; 
     }  
     convertView = inflater.inflate(res, viewGroup, false); 
     holder = new ViewHolder(); 
     holder.txtMessage = (TextView) convertView.findViewById(R.id.txtMessage); 
     holder.txtDate = (TextView) convertView.findViewById(R.id.txtDate); 
     row.setTag(holder); 
    } 
    //You have get tag every time else it will through NullPointerException 
    holder = (ViewHolder)row.getTag(); 
    holder.txtMessage.setText(messages.get(i).message); 
    holder.txtDate.setText(messages.get(i).time); 

    return row; 
} 

static class ViewHolder 
{ 
    TextView txtMessage; 
    TextView txtDate; 
} 

Проверить выше код, который вы сделали какую-то ошибку, которая у меня есть сделать правильно.