ListView不适用于片段(ListView doesn't work for fragment)
我的ListView有一个小问题,它在我使用Activity时有效但当我切换到片段时它不起作用。
这是代码:
package com.groupex.tp_mobile; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView.FindListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.zip.Inflater; public class Fragment1 extends Fragment implements OnItemClickListener{ ListView listView; communicator communic; String[] nameMenu; String[] menuDescription; int[] images={R.drawable.pizza, R.drawable.frenchfries, R.drawable.fishsoup, R.drawable.tomatosoup}; public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { // Inflate the layout for this fragment View view=inflater.inflate(R.layout.fragment1, container, false); listView=(ListView) view.findViewById(R.id.menu1); Resources resources=getResources(); nameMenu=resources.getStringArray(R.array.nameMenu); menuDescription=resources.getStringArray(R.array.menuDescription); CustomAdapter adapter=new CustomAdapter(container.getContext(), nameMenu, images, menuDescription); listView.setAdapter(adapter); listView.setOnItemClickListener(this); return view; } class CustomAdapter extends ArrayAdapter<String>{ Context context; int[] imags; String[] nameMenuArray; String[] menuDescriptionArray; CustomAdapter(Context c, String[] titles, int imgs[], String[] descri){ super(c, R.layout.singlerow, R.id.textViewNom, titles); this.context=c; this.imags=imgs; this.nameMenuArray=titles; this.menuDescriptionArray=descri; } class MyViewHolder{ ImageView MyImage; TextView MyTitle; TextView MyDescription; public MyViewHolder(View view) { // TODO Auto-generated constructor stub MyImage=(ImageView)view.findViewById(R.id.images); MyTitle=(TextView)view.findViewById(R.id.textViewNom); MyDescription=(TextView)view.findViewById(R.id.textViewFonction); } } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View row=convertView;//On recuere le relative layout MyViewHolder holder=null; if(row==null){ LayoutInflater inflater=(LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); row=inflater.inflate(R.layout.singlerow, parent, false); holder=new MyViewHolder(row); //We store the holder in the row by using setTag(Object) row.setTag(holder); android.util.Log.d("Dehii", "New row has been created"); } //Recyclage. else{ holder=(MyViewHolder) row.getTag(); android.util.Log.d("Dehii", "Recycling a row"); } holder.MyImage.setImageResource(imags[position]); holder.MyTitle.setText(nameMenuArray[position]); holder.MyDescription.setText(menuDescription[position]); return row; } } @Override public void onItemClick(AdapterView<?> arg0, View view, int i, long l) { // TODO Auto-generated method stub } public void setCommunicator(communicator commun){ this.communic=commun; } public interface communicator{ public void respond(int index); } } // End class definition这是错误消息:
FatalException: NullPointerException Fragment.customAdapter.$CustomView(Fragment1.java:104) . . . . . android.widget.ListView.OnMeasure(ListView java:1175)我还没有足够的声誉来添加图片。
感谢您的帮助。
i have a small problem with my ListView, It works when i use an Activity but when I switch to a fragment it doesn't work.
Here is the code:
package com.groupex.tp_mobile; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView.FindListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.zip.Inflater; public class Fragment1 extends Fragment implements OnItemClickListener{ ListView listView; communicator communic; String[] nameMenu; String[] menuDescription; int[] images={R.drawable.pizza, R.drawable.frenchfries, R.drawable.fishsoup, R.drawable.tomatosoup}; public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { // Inflate the layout for this fragment View view=inflater.inflate(R.layout.fragment1, container, false); listView=(ListView) view.findViewById(R.id.menu1); Resources resources=getResources(); nameMenu=resources.getStringArray(R.array.nameMenu); menuDescription=resources.getStringArray(R.array.menuDescription); CustomAdapter adapter=new CustomAdapter(container.getContext(), nameMenu, images, menuDescription); listView.setAdapter(adapter); listView.setOnItemClickListener(this); return view; } class CustomAdapter extends ArrayAdapter<String>{ Context context; int[] imags; String[] nameMenuArray; String[] menuDescriptionArray; CustomAdapter(Context c, String[] titles, int imgs[], String[] descri){ super(c, R.layout.singlerow, R.id.textViewNom, titles); this.context=c; this.imags=imgs; this.nameMenuArray=titles; this.menuDescriptionArray=descri; } class MyViewHolder{ ImageView MyImage; TextView MyTitle; TextView MyDescription; public MyViewHolder(View view) { // TODO Auto-generated constructor stub MyImage=(ImageView)view.findViewById(R.id.images); MyTitle=(TextView)view.findViewById(R.id.textViewNom); MyDescription=(TextView)view.findViewById(R.id.textViewFonction); } } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View row=convertView;//On recuere le relative layout MyViewHolder holder=null; if(row==null){ LayoutInflater inflater=(LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); row=inflater.inflate(R.layout.singlerow, parent, false); holder=new MyViewHolder(row); //We store the holder in the row by using setTag(Object) row.setTag(holder); android.util.Log.d("Dehii", "New row has been created"); } //Recyclage. else{ holder=(MyViewHolder) row.getTag(); android.util.Log.d("Dehii", "Recycling a row"); } holder.MyImage.setImageResource(imags[position]); holder.MyTitle.setText(nameMenuArray[position]); holder.MyDescription.setText(menuDescription[position]); return row; } } @Override public void onItemClick(AdapterView<?> arg0, View view, int i, long l) { // TODO Auto-generated method stub } public void setCommunicator(communicator commun){ this.communic=commun; } public interface communicator{ public void respond(int index); } } // End class definitionAnd here is the error messages :
FatalException: NullPointerException Fragment.customAdapter.$CustomView(Fragment1.java:104) . . . . . android.widget.ListView.OnMeasure(ListView java:1175)I don't have enough reputation yet to add an image.
Thank you for your help.
最满意答案
你为什么不使用ListFragment?
public class MyListFragment extends ListFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); String[] values = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, values); setListAdapter(adapter); } @Override public void onListItemClick(ListView l, View v, int position, long id) { // do something with the data } }Why don't you use a ListFragment?
public class MyListFragment extends ListFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); String[] values = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" }; ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, values); setListAdapter(adapter); } @Override public void onListItemClick(ListView l, View v, int position, long id) { // do something with the data } }更多推荐
发布评论