2015-08-06 2 views
0

У меня есть пользовательский массивный адаптер, и по мере того, как новые данные поступают в список, он продолжает расти. Но, добавляя новые данные к базовому адаптеру с помощью adapter.add, а затем вызывая notifyDataSetChanged(), адаптер обновляется, но он не обновляется автоматически, как я ожидал. Он обновляется только при попытке прокрутки. Я хочу, чтобы listview автоматически обновлялся. Я искал везде, и он говорит мне использовать notifysetdatachanged. Где я неправ?ArrayAdapter не обновляется автоматически

Ниже мой код:

class MyArrayAdapter extends ArrayAdapter { 
public MyArrayAdapter(Context context) { 
     super(context, R.layout.chat_list, messages); 
    } 

    //  @Override 
    public View getView(int position, View convertView, ArrayList<String> messages, ViewGroup parent) { 
     final Viewholder viewholder; 
     if(convertView == null) 
     { 
      LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.chat_list, parent, false); 
      viewholder = new Viewholder(); 
      viewholder.message = (TextView) convertView.findViewById(R.id.text1); 
      convertView.setTag(viewholder); 
     } 
     else { 
      viewholder = (Viewholder) convertView.getTag(); 
     } 
     viewholder.message.setText(chat.messages.get(position).toString()); 

     return convertView; 
    } 

    @Override 
    public int getCount() { 
     return messages.size(); 
    } 

} 
static class Viewholder 
{ 
    TextView message; 
} 

Другой фрагмент, где я называю datachanged:

Message new_message = (Message) packet; 
       if(new_message.getBody() != null) 
       { 
        Log.v("LogCat", "Message Received from " + new_message.getFrom() + " and as " + new_message.getBody()); 

        messages.add("From: " + new_message.getFrom().toString()); 
        messages.add(new_message.getBody()); 

        myadapter.add(new_message.getFrom().toString()); // i also tried to disable this.. dint work 
        myadapter.add(new_message.getBody()); 


        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 
          myadapter.notifyDataSetChanged(); 

         } 
        }); 
       } 
      } 
+0

'ArrayAdapter # add' уже называет' notifyDataSetChanged', нет никакой необходимости в том, что вы можете отключить эту функцию, вызвав 'ArrayAdapter # setNotifyOnChange' – pskink

+0

Спасибо .. я удалим эту строку , Но как насчет автоматического обновления. –

ответ

0

Как вы используете Array, адаптер, при добавлении объекта с помощью добавления() из массива адаптера он добавляет объект в конец массива, поэтому вам нужно будет прокрутить до конца списка, чтобы увидеть новый Data in List View, вы можете использовать что-то вроде этого

mListView.smoothScrollToPosition (mAdatper.getCount() - 1)

Чтобы программно прокрутить до конца списка, чтобы получить добавил новые данные.

+0

Я начинаю с нулевых элементов в представлении списка. Я просто пробовал свой ответ, но он ничего не делает. Я должен вручную обновить список, коснувшись экрана. –

0

Для тех, кто может споткнуться в такой же ситуации. Мне пришлось изменить его так, как это может быть неправильным: сообщения - это базовый массив объектов, к которому обращается адаптер.

messages.add("From: " + new_message.getFrom().toString()); 
messages.add(new_message.getBody()); 

mHandler.post(new Runnable() { 
@Override 
public void run() { 
    myadapter.notifyDataSetChanged(); 
} 
}); 
+0

Нет его неправильного пути: 'ArrayAdapter # add()' это просто создать простой проект и дать ему попробовать – pskink

+0

Да, он работает в любом случае, потому что arrayadapter ссылается на объект сообщения. Но если мы хотим изменить некоторую информацию о представлениях, используя мой путь, это может стать простым, я полагаю. Мы можем просто изменить сообщение (позицию) и вызвать notifydatachaged. Возможно, я ошибаюсь –

0

Для меня проблема заключалась в том, что я не вызывал адаптер.add() из того же потока, который создал адаптер. Так что попробуйте следующее:

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     myadapter.add(new_message.getFrom().toString()); 
     myadapter.add(new_message.getBody()); 
    } 
}); 
Смежные вопросы