问题
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));.
来源:https://stackoverflow.com/questions/20177089/android-baseadapter-with-fragment