У меня есть пользовательский 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;
}
}
Пожалуйста показать StreamAdapter класс –
@Mohamed_AbdAllah я добавил его к моей должности в настоящее время. – Phoebe
[Это рабочий демонстрационный пример для динамического добавления данных в ListView] (https://github.com/lalit3686/ListViewLoadingItems) –