A. Steenbergen
A. Steenbergen

Reputation: 3440

Android notifydatasetchanged results in invisible/empty list

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

Answers (1)

A. Steenbergen
A. Steenbergen

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

Related Questions