Reputation: 3440
I have a custom adapter that is feeding a list from a custom data object. API Level is 14+, so Android 4+:
Adapter
public class NewsAdapter extends BaseAdapter {
private final Context mContext;
private NewsData mData;
public NewsAdapter(Context context, final NewsData data) {
mContext = context;
mData = data;
}
public void replaceData(final NewsData data) {
mData = data;
notifyDataSetChanged();
}
@Override
public int getCount() {
return mData.getNews().getNewsItems().size();
}
@Override
public NewsItem getItem(int position) {
return mData.getNews().getNewsItems().get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView (int position, View convertView, ViewGroup parent){
NewsViewHolder viewHolder;
if(convertView == null){
//inflate view
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_news, parent, false);
// Create a viewHolder enabled row
viewHolder = new NewsViewHolder();
viewHolder.newsTitle = (TextView) convertView.findViewById(R.id.news_title);
viewHolder.newsSubTitle = (TextView) convertView.findViewById(R.id.news_sub_title);
viewHolder.newsDescription = (TextView) convertView.findViewById(R.id.news_desc);
viewHolder.newsDate = (TextView) convertView.findViewById(R.id.news_date);
viewHolder.newsThumb = (ImageView) convertView.findViewById(R.id.news_thumb);
convertView.setTag(viewHolder);
} else {
viewHolder = (NewsViewHolder) convertView.getTag();
}
// fill row with data
final NewsItem newsItem = getItem(position);
Log.i("hweb","Getting Item "+position+": "+newsItem.getTitle());
viewHolder.newsTitle.setText(newsItem.getTitle());
viewHolder.newsSubTitle.setText(newsItem.getSubTitle());
viewHolder.newsDescription.setText(newsItem.getDescription());
viewHolder.newsDate.setText(SimpleDateFormat.getDateInstance().format(new Date(newsItem.getDate() * 1000)));
Picasso.with(mContext).load(newsItem.getImageThumb2x()).into(viewHolder.newsThumb);
return convertView;
}
public class NewsViewHolder {
public TextView newsTitle;
public TextView newsSubTitle;
public TextView newsDescription;
public TextView newsDate;
public ImageView newsThumb;
}
}
I am filling my list with data as soon as it is available, later the list gets updated and the same method is called with a completely new data object, that is supposed to replace the old data object:
public void onEventMainThread(NewsData newsData) {
mNewsData = newsData;
if (mNewsAdapter == null){
mNewsAdapter = new NewsAdapter(getActivity(), mNewsData);
addHeaderPager(5);
mNewsListView.setAdapter(mNewsAdapter);
} else {
mNewsAdapter.replaceData(mNewsData);
}}
}
I know the data is being handed over to this method correctly, because of LogCat, but the list doesn't seem to refresh anything, it only seems to work, when I create a new adapter, which I do not want to do everytime I update the list (partly because the list will reset its scrolling to 0 and other reasons).
I tried calling the update method explicitly on the UI thread, but it didnt help. I removed the header creation temporarily - nothing.
Maybe you need to know, that this is all happening inside of a fragment.
Your help is much appreciated!
Upvotes: 0
Views: 1029
Reputation: 3440
I found the cause, it wasn't my listadapter code. My updateData function sometimes returned data at a point where listview wasnt recreated after onResume yet. Thus the list had a height of 0. Moving my updateData function out of onCreate and into onCreateView, where all ui components where surely initialized solved the error.
It's working now, awesome! But it sucks to have spend hours sifting through every inch of perfectly working code searching for that one nonexistant line that messes everything up!
Upvotes: 2