Android BaseAdapter with Fragment

2019-04-27 20:52发布

问题:

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;
    }

}

回答1:

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.



回答2:

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;
    }


回答3:

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));.