android - ListView 不适用于 fragment

标签 android android-layout listview android-fragments android-listview

我的 ListView 有一个小问题,它在我使用 Activity 时有效,但当我切换到 fragment 时它不起作用。

代码如下:

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)

我还没有足够的声誉来添加图像。

感谢您的帮助。

最佳答案

为什么不使用 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
  }
} 

关于android - ListView 不适用于 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22792339/

相关文章:

android - 为什么在调用 setRetainInstance(true) 时,TextView 的文本没有恢复?

android - fitsSystemWindows on Fragment、Activity 和 DrawerLayout 组合

android - 运行时异常 : Unable to start activity

android - 所有自定义 View 实例变量均为 null

asp.net - 如何将嵌套 List<> 对象中的数据绑定(bind)到嵌套 ListView 控件?

java - 如何在“操作”选项卡中回调按钮

php - Android 的 Json 输出

android - 在 android 中拉取 ListView 时刷新适配器

android - 从另一个 Activity 移回上一个 Activity,不知道 Activity 在堆栈中的位置

android - 高度 ListView - 所有行可见