1

Am having this weird issue of getview not called inside baseadapter.

Scenario:

  • Main fragment has a carousel (which loads perfectly fine)
  • Button click shows another fragment with another carousel
  • Data is fetched from server and the adapter is called
  • Adapter gets called without a problem
  • GetCount() gets called
  • GetView() does'nt get called

Interestingly the getView method is fired when the fragment is popped or back button is pressed.


Adapter code

public class VideCarouselAdapter extends BaseAdapter {

    private Context context;
    private NavigationFragment nf;
    private float scale;

    ArrayList<DataModel> videoList = new ArrayList<DataModel>();
    public VideCarouselAdapter(Context context,NavigationFragment nf) {
        this.context = context;
        this.nf=nf;
    }

    public void setData(ArrayList<DataModel> videoList) {
        Timber.log(Log.DEBUG,"VideCarouselAdapter instantiated");
        System.out.println(videoList);
        this.videoList=videoList;
        System.out.println("Total items"+videoList.size());
    }

    @Override
    public Object getItem(int position)
    {
        return videoList.get(position);
        //return VideosCarouselItem.newInstance(context, position, scale,videoList.get(position).getVideoID());
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        Timber.log(Log.DEBUG,"VideCarouselAdapter GEtView");
        View rowView = convertView;

        if (rowView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.item_coverflow, null);

            ViewHolder viewHolder = new ViewHolder();
            viewHolder.text = (TextView) rowView.findViewById(R.id.label);
            viewHolder.image = (SimpleDraweeView) rowView
                    .findViewById(R.id.image);
            rowView.setTag(viewHolder);
        }

        ViewHolder holder = (ViewHolder) rowView.getTag();
        Uri uri = Uri.parse("http://img.youtube.com/vi/"+videoList.get(position).getVideoID()+"/0.jpg");
        Timber.log(Log.DEBUG, "SETTING IMAGE FOR RELATED CAROUSEL "+"http://img.youtube.com/vi/"+videoList.get(position).getVideoID()+"/0.jpg");
        holder.image.setImageURI(uri);
        holder.text.setText(videoList.get(position).getTitle());
        holder.image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Timber.log(Log.DEBUG,"Image touched "+parent.getClass().toString());
                CoverFlowCarousel coverflow=((CoverFlowCarousel)parent);
                int currentSelection=coverflow.getSelection();
                if(currentSelection==position) {
                    nf.presentFragment(VideoInformation.newInstance(videoList.get(position).getVideoID(),videoList.get(position).getTitle(),
                            videoList.get(position).getDescription()));
                    return;
                };
                if(currentSelection<position){
                    coverflow.fling(Math.round(coverflow.getX()+1200),Math.round(coverflow.getY()));
                }else{
                    coverflow.fling(Math.round(coverflow.getX()-1200),Math.round(coverflow.getY()));
                }


            }
        });

        return rowView;
    }

    @Override
    public int getCount()
    {
        Timber.log(Log.DEBUG,"VideCarouselAdapter COunt "+videoList.size());
        return videoList.size();
    }

    static class ViewHolder {
        public TextView text;
        public SimpleDraweeView image;
    }


}

Debug log when fragment is on screen

VideCarouselAdapter COunt 12
VideCarouselAdapter COunt 12
VideCarouselAdapter COunt 12
VideCarouselAdapter COunt 12
VideCarouselAdapter COunt 12

Debug log the moment fragment is dismissed

SETTING IMAGE FOR RELATED CAROUSEL http://img.youtube.com/vi/kJQqJgGpfeQ/0.jpg
VideCarouselAdapter COunt 15
VideCarouselAdapter COunt 15
VideCarouselAdapter GEtView
SETTING IMAGE FOR RELATED CAROUSEL http://img.youtube.com/vi/H403Uyf_TC0/0.jpg
VideCarouselAdapter COunt 15
VideCarouselAdapter COunt 15
VideCarouselAdapter GEtView
SETTING IMAGE FOR RELATED CAROUSEL http://img.youtube.com/vi/78x8iOdUdXg/0.jpg
VideCarouselAdapter COunt 15
VideCarouselAdapter COunt 15
VideCarouselAdapter GEtView
SETTING IMAGE FOR RELATED CAROUSEL http://img.youtube.com/vi/Pi7NhJE7O_0/0.jpg
VideCarouselAdapter COunt 15
VideCarouselAdapter COunt 15
VideCarouselAdapter GEtView
SETTING IMAGE FOR RELATED CAROUSEL http://img.youtube.com/vi/MMg1TpADGBw/0.jpg
VideCarouselAdapter COunt 15
VideCarouselAdapter GEtView
SETTING IMAGE FOR RELATED CAROUSEL http://img.youtube.com/vi/j3PwwoTjpNg/0.jpg
VideCarouselAdapter GEtView
SETTING IMAGE FOR RELATED CAROUSEL http://img.youtube.com/vi/jB_zCJ2s2jc/0.jpg
VideCarouselAdapter GEtView
SETTING IMAGE FOR RELATED CAROUSEL http://img.youtube.com/vi/SrldmVxWu_s/0.jpg
VideCarouselAdapter GEtView
SETTING IMAGE FOR RELATED CAROUSEL http://img.youtube.com/vi/ytka9QZoNAw/0.jpg

The current carousel creation code inside the sub fragment

private void setupCoverflow(){
    Timber.log(Log.DEBUG,"SETTING UP RELATED VIDEOS");
    carousel.setSpacing(0.55f);
    carousel.setScaleX(1.5f);
    carousel.setRotation(0.0f);
    adapter = new VideCarouselAdapter(getActivity(),this);
    adapter.setData(videoList);
    carousel.setAdapter(adapter);
    if(carouselCurrentItem==0)
        carousel.setSelection(adapter.getCount()/2);
    else
        carousel.setSelection(carouselCurrentItem);
    txtVideoTitle.setText(videoList.get(carousel.getSelection()).getTitle());


    carousel.setOnItemSelectedListener(new Carousel.OnItemSelectedListener() {
        @Override
        public void onItemSelected(View child, int position) {
            txtVideoTitle.setText(videoList.get(position).getTitle());
            carouselCurrentItem=position;
        }
    });

}

Mainfragment (Working carousel) https://picasaweb.google.com/lh/photo/_7J6d3winzVWXf8eiAYqxe4jdbH5efcZ8QVU3HGZSEA

Subfragment (Similar code, but carousel does'nt work) https://picasaweb.google.com/lh/photo/p12bBck2bDWWFGiHqaZwWe4jdbH5efcZ8QVU3HGZSEA

The red color, shows that carousel view is visible. As i mentioned in the post, data is loaded, getcount events are called with the correct count.

Sander de Jong
  • 299
  • 3
  • 15
Veeru
  • 4,814
  • 2
  • 39
  • 60
  • After `adapter.setData(videoList);` you must call `adapter.notifyDataSetChanged();` to update the adapter. – Dhaval Patel May 11 '16 at 06:48
  • Its still the same Dhaval, in fact i have tried that even before posting the question. – Veeru May 11 '16 at 06:51
  • change the statement of inflating in getview like this: rowView = inflater.inflate(R.layout.item_coverflow, parent,false); – akhil Rao May 11 '16 at 06:53
  • not sure but one effort of `notifyDataSetChanged` is that `getView()` mustn´t be called to refresh, isn´t it? – Opiatefuchs May 11 '16 at 06:54
  • @akhilRao - there is no such method to inflate to accept boolean? Opiatefuchs - In my main fragment, i was never called notifydatasetchanged. For the sub fragment, am only trying the possibilities – Veeru May 11 '16 at 06:59
  • This [link](http://stackoverflow.com/questions/16338281/custom-adapter-getview-method-is-not-called) might be help you – Mangesh Sambare May 11 '16 at 07:06
  • @Sam, i have seen it before posting here. I have checked all possiblities. The same adapter works for the main fragment. Added screenshots – Veeru May 11 '16 at 07:07
  • Put your log statement in condition "rowView == null" in your getView Method and see what happenes – AbhayBohra May 11 '16 at 07:53
  • Have you tried `carousel.postInvalidate()` after doing `carousel.setAdapter(adapter); adapter.notifyDataSetChanged();` ? – Shark May 11 '16 at 08:40
  • Doesn't help shark. Slowlearner, GetView() is not even getting called until the fragment is popped – Veeru May 11 '16 at 09:44
  • Any updates on this thread ? I am facing a similar problem.. – user3276247 Sep 17 '17 at 06:30

1 Answers1

0

Use

 adapter = new VideCarouselAdapter(getActivity(),this);
            adapter.setData(videoList);
YOUR_LISTVIEW.setAdapter(adapter);
Md. Sajedul Karim
  • 6,263
  • 3
  • 47
  • 77