0

У меня есть пользовательский ListView, который я заполняю своим пользовательским ArrayAdapter. Я читаю и разбираю json-данные из URL-адресов и заполняю ListView этим. Он отлично работает, когда я читаю первый файл. Однако теперь я хочу добавить больше данных (более старые сообщения) в список ListView. Я добавил кнопку «Load More» в качестве нижнего колонтитула в ListView, когда я загрузил новые данные, хотя и пытаюсь прокрутить через него я получаю эту ошибку:Сделайте свой пользовательский ArrayAdapter ListView расширяемым?

java.lang.IndexOutOfBoundsException: Invalid index 25, size is 25

Сначала я не сделал понять, почему это было, теперь я понимаю, что мой ListView не расширяется. Когда я поиск Google для расширяемого ListViews пользовательских адаптеры расширяют BaseExpandableListAdapter, но я не знаю, как осуществить это в моем приложении .. Моего заказ arrayadapter определяется следующим образом:

private class StreamAdapter extends ArrayAdapter<Message> 

сообщения является одним из моих классов ,

Это, как я отображать данные:

private void DisplayData() { 
    // If the request was successfull then notify the adapter to display the data 
    if(success) { 

     if(dataAdapter.isEmpty()) 
     { 
      dataAdapter.addAll(dataList); 
      dataAdapter.notifyDataSetChanged(); 
     } 
     // If the listview isn't empty we want to erase what's there and then add the older posts to display 
     else 
     { 
      /** Add currently displayed messages to a temporary arraylist, clear the listview, then add both arraylists in the correct order **/ 
      int size = messageList.getTop(); 
      ArrayList<Message> temp = new ArrayList<Message>(); 

      for(int i = 0; i < size; i++) 
      { 
       temp.add(dataAdapter.getItem(i)); 
      } 
      dataAdapter.clear(); 
      temp.addAll(dataList); 

      dataAdapter.addAll(temp); 
      dataAdapter.notifyDataSetChanged(); 
     } 
    } 
} 

Весь темп-ArrayList-вещь была единственным способом я мог придумать, чтобы получить вновь загруженные данные (но старые сообщения) в нижней части listview вместо верхнего.

Есть ли способ легко сделать мой ListView расширяемым или мне нужно переписать весь класс StreamAdapter?

Кристина

EDIT: Вот код для моего класса StreamAdapter, я оставил части из, хотя, как я довольно уверен, что это не имеет отношения, и только добавляет кучу кода.

частный класс StreamAdapter расширяет ArrayAdapter {

public StreamAdapter(Context context, int textViewResourceId, ArrayList<Message> dataList) 
{ 
    super(context,textViewResourceId, dataList); 
} 

private class ViewHolder { 
    ImageView thumbnail; 
    TextView display_name; 
    TextView username; 
    TextView created_at; 
    TextView text; 
    ImageView comments; 
    TextView nr_comments; 
    @SuppressWarnings("unused") 
    ImageView like; 
    TextView nr_likes; 
    @SuppressWarnings("unused") 
    ImageView starred; 
    TextView nr_starred; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 

    if(convertView == null) 
    { 
     LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = vi.inflate(R.layout.data_row, null); 


     holder = new ViewHolder(); 
     holder.thumbnail = (ImageView) convertView.findViewById(R.id.thumbnail); 
     holder.display_name = (TextView) convertView.findViewById(R.id.display_name);    
     holder.username = (TextView) convertView.findViewById(R.id.username); 
     holder.created_at = (TextView) convertView.findViewById(R.id.created_at); 
     holder.text = (TextView) convertView.findViewById(R.id.text); 
     holder.comments = (ImageView) convertView.findViewById(R.id.comments); 
     holder.nr_comments = (TextView) convertView.findViewById(R.id.nr_comments); 
     holder.like = (ImageView) convertView.findViewById(R.id.like); 
     holder.nr_likes = (TextView) convertView.findViewById(R.id.nr_likes); 
     holder.starred = (ImageView) convertView.findViewById(R.id.starred); 
     holder.nr_starred = (TextView) convertView.findViewById(R.id.nr_starred); 

     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    final Message data = dataList.get(position); 
    holder.thumbnail.setImageDrawable(getResources().getDrawable(R.drawable.owl_thumbnail)); 
    holder.display_name.setText(data.created_by.getDisplay_name()); 
    holder.username.setText("@"+data.created_by.getUsername()); 
    holder.created_at.setText(data.getCreated_at()); 
    holder.nr_comments.setText(Integer.toString(data.getComments().length)); 
    holder.nr_likes.setText(Integer.toString(data.getLiked_by().length)); 
    holder.nr_starred.setText(Integer.toString(data.getStarred_by().length)); 


    // Code to make certain text in the text-textview clickable 

    // Clickhandler for the username (display_name) 
    holder.display_name.setOnClickListener(new OnClickListener() { 
     // Code 
    }); 

    // Clickhandler for comments 
    holder.comments.setOnClickListener(new OnClickListener() { 
     //Code 
    }); 

    return convertView; 
} 

}

+0

Пожалуйста показать StreamAdapter класс –

+0

@Mohamed_AbdAllah я добавил его к моей должности в настоящее время. – Phoebe

+0

[Это рабочий демонстрационный пример для динамического добавления данных в ListView] (https://github.com/lalit3686/ListViewLoadingItems) –

ответ

0

Вместо добавления новых данных к адаптеру пунктов попытаться получить ссылку на свой список данных из адаптера и добавьте в нее данные для Ex:

private class StreamAdapter extends ArrayAdapter { 

private ArrayList<Message> dataList; 
public StreamAdapter(Context context, int textViewResourceId, ArrayList<Message> dataList) 
{ 
    super(context,textViewResourceId, dataList); 
    this.dataList=dataList; 
} 

public ArrayList<Message> getDataList(){ 
    return dataList; 
} 

public void setDataList(ArrayList<Message> dataList){ 
    this.dataList=dataList; 
} 

... 
... 

} 

И когда вы обновляете его

private void DisplayData() { 
    // If the request was successfull then notify the adapter to display the data 
    if(success) { 

      ArrayList<Message> temp = dataAdapter.getDataList(); 

      for(int i = 0; i < dataList.size(); i++) 
      { 
       temp.add(i,dataList.get(i)); 
      } 

      dataAdapter.notifyDataSetChanged(); 
     } 
} 

Это должно работать, попробуйте и дайте мне знать.

переопределять также следующие функции внутри адаптера

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

EDIT

private void DisplayData() { 
    // If the request was successfull then notify the adapter to display the data 
    if(success) { 

      ArrayList<Message> temp = dataAdapter.getDataList(); 
      dataList.addAll(temp); 
      dataAdapter.setDataList(dataList); 

      dataAdapter.notifyDataSetChanged(); 
     } 
} 

EDIT 2

private void DisplayData() { 
    // If the request was successfull then notify the adapter to display the data 
    if(success) { 

      ArrayList<Message> temp = dataAdapter.getDataList(); 
      temp.addAll(dataList); 
      dataAdapter.notifyDataSetChanged(); 
     } 
} 
+0

просто не позволяйте вашему datalist быть пустым набором пустого списка вместо –

+0

Он дал мне ту же ошибку, но с 50 вместо 25 «java.lang.IndexOutOfBoundsException: Неверный индекс 50, размер 50». И я объявил свой dataList «private ArrayList dataList = new ArrayList ();" – Phoebe

+0

Каков размер вашего списка? –

0

Нет, вы не должны использовать ExpandableListAdapter, и вы не должны обеспечить новую реализацию адаптера. Исключение, которое вы получаете, вероятно, связано с плохой обработкой массива, как вы уже догадались. У меня была аналогичная проблема, но я использовал адаптеры с Cursor (запросы к базе данных), поэтому Я думаю, что notifydataSetChanged() должно быть достаточно, чтобы адаптер мог перезагрузить данные и отобразить их после того, как адаптер был заполнен дополнительными данными.

ExpandableListAdapter используется, когда вам нужно отображать данные в пути PARENT -> CHILDREN, поэтому с помощью ExpandableListView вы видите список родительских элементов, каждый из которых содержит несколько дочерних элементов, каждый родитель расширяет/сворачивает (и таким образом показывает/скрывает дети), когда вы нажимаете на нее.

0

Попробуйте заменить

int size = messageList.getTop(); 

с

int size = dataAdapter.getCount(); 
Смежные вопросы