Android BaseAdapter with Fragment
Asked Answered
G

3

6

Unable to compile this code and run. getting issue in lv.setAdapter(new VcAdapter (this)); kindly help. If I try to not pass (this), then code compile fine, but run time getting error stating content need to have listview.

import java.util.ArrayList;

import com.vaishnavismeclass.tiruppavai.tab.R;
import com.vaishnavismeclass.tiruppavai.tab.SingleRow;

import android.support.v4.app.Fragment;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class EnglishFragment extends Fragment {

    Context context = null;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_english, container, false);

        ListView lv = (ListView) rootView.findViewById(R.id.list); 
        lv.setAdapter(new VcAdapter (this));

        return rootView;
    }
}

class SingleRow
{
    String pasuram;
    int img;

    SingleRow(String pasuram, int img)
    {
        this.pasuram=pasuram;
        this.img=img;
    }
}
class VcAdapter extends BaseAdapter
{
    ArrayList<SingleRow> list;
    Context context;
    VcAdapter(Context c)
    {
        context = c;
        list = new ArrayList<SingleRow>();
        //get resources using context
        Resources res=c.getResources();
        String[] pasuram_en = res.getStringArray(R.array.pasuram_en);
        //String[] pasuram_ta = res.getStringArray(R.array.pasurams_ta);
//      String[] pasuram_te = res.getStringArray(R.array.pasurams_te);
        int[] imgs = {R.drawable.p1,R.drawable.p1,R.drawable.p1,R.drawable.p1,R.drawable.p2,R.drawable.p3,R.drawable.p4,R.drawable.p5,R.drawable.p6,R.drawable.p7,R.drawable.p8,R.drawable.p9,R.drawable.p10,R.drawable.p11,R.drawable.p12,R.drawable.p13,R.drawable.p14,R.drawable.p15,R.drawable.p16,R.drawable.p17,R.drawable.p18,R.drawable.p19,R.drawable.p20,R.drawable.p21,R.drawable.p22,R.drawable.p23,R.drawable.p24,R.drawable.p25,R.drawable.p26,R.drawable.p27,R.drawable.p28,R.drawable.p29,R.drawable.p30,R.drawable.p1,R.drawable.p1};

        for (int i=0;i<pasuram_en.length;i++)
        {
            //list.add(new SingleRow(pasuram_en[i], imgs[i]));
            list.add(new SingleRow(pasuram_en[i], imgs[i]));
        }
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        // TODO Auto-generated method stub
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        // TODO Auto-generated method stub
        LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.single_row, viewGroup, false);

        TextView pasuram = (TextView) row.findViewById(R.id.textView1);
        ImageView img = (ImageView) row.findViewById(R.id.imageView1);

        SingleRow temp=list.get(i);
        pasuram.setText(temp.pasuram);
        img.setImageResource(temp.img);

        return row;
    }

}
Generalization answered 24/11, 2013 at 16:44 Comment(0)
W
5

Change

lv.setAdapter(new VcAdapter (this));

to

lv.setAdapter(new VcAdapter(getActivity()));

You need to pass activity context.

getActivity()

Return the Activity this fragment is currently associated with.

Working answered 24/11, 2013 at 16:46 Comment(2)
With lv.setAdapter(new VcAdapter(getActivity())); the code is compiled and app is running, but not populating the listview.Generalization
@Generalization check the adapter getview it has nothing to do with the change suggestedWorking
R
0

you also need to change this

@Override
    public long getItemId(int i) {
        // TODO Auto-generated method stub
        return 0;
    }

to

@Override
    public long getItemId(int i) {
        // TODO Auto-generated method stub
        return i;
    }
Rife answered 14/4, 2015 at 14:35 Comment(0)
I
0

Your fragment list is probably not be getting populated because you are not passing the correct id into your fragment layout file.

In your fragment layout file, you should use

android:id="@android:id/list"

And NOT

android:id="+@id/list"

Trying to do it manually with the second option will work for Activities, but not for Fragments.

Therefore, you also have to extend a ListFragment instead of a Fragment, so that way BaseAdapter can figure out that you do in fact have a ListView within your fragment that it can set to the custom adapter. This also eliminates the need for you to explicitly define your ListView, meaning that you can safely remove the line where you retrieve it and still allow the fragment to generate its appropriate view.

Although, you will need to call setListAdapter(new VcAdapter (this)); instead of lv.setAdapter(new VcAdapter (this));.

Institutionalize answered 30/1, 2019 at 21:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.