2017-07-25 56 views
0

我有一個ListView,我想去GridView OnItemCLiclick監聽器。我有一個適配器的例外,我無法解決它。GridView:試圖調用虛擬method.view.View android.view.LayoutInflater.inflate(int,android.view.ViewGroup)'在一個空對象參考

列表視圖是一個片段,它工作得很好!

例外情況是:

顯示java.lang.NullPointerException:嘗試調用虛擬方法 'android.view.View android.view.LayoutInflater.inflate(INT,android.view.ViewGroup)' 上的空對象引用 在com.rt_no.myprogect.ui.adapter.CareerImageAdapter.getView(CareerImageAdapter.java:52)

在這條線在GridView適配器:

convertView = layoutInflater.inflate(R.layout.career_grid_view, null); 

的ListView中:

public class CitiesFragment extends Fragment { 
    private static final String TAG ="CitiesFragment"; 

    private ListView cityList; 
    private ArrayList<City> cities; 
    private CitiesAdapter citiesAdapter; 
    private CitiesFragmentListener listener; 

    private Context context; 

    private GridView gridView; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     Log.d(TAG, "onAttach_CitiesFragment"); 
     listener = (CitiesFragmentListener) context; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Log.d(TAG, "onCreateView_CitiesFragment"); 
     View view = inflater.inflate(R.layout.cities_list_view_fragment, null); 
     return view; 
    } 

    private ArrayList<City> initCities(){.....} 

    private void initGridView(Fragment fragment){ 
     Log.d(TAG, "CitiesFragment_initGridView"); 
     FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.container,fragment); 
     fragmentTransaction.addToBackStack("fragment"); 
     fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     fragmentTransaction.commit(); 
    } 


    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     Log.d(TAG, "onViewCreated_CitiesFragment"); 
     cities = initCities(); 
     cityList = (ListView) view.findViewById(R.id.cityList); 
     citiesAdapter = new CitiesAdapter(getActivity(), cities); 
     cityList.setAdapter(citiesAdapter); 
     cityList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Log.d(TAG, "onItemClick_CitiesFragment position : " + cities.get(position).getCityName()); 
       GridViewFragment fragment = new GridViewFragment(); 
       initGridView(fragment); 
      } 
     }); 
    } 

GridView控件:

public class GridViewFragment extends Fragment { 
    private static final String TAG = "GridViewFragment"; 

    private CitiesFragmentListener listener; 
    private GridView gridView; 
    private CareerImageAdapter careerImageAdapter; 
    private int position; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
     Log.d(TAG, "onCreateView_GridViewFragment"); 
     View view = inflater.inflate(R.layout.career_grid_view, null); 
     gridView = (GridView) view.findViewById(R.id.careerGridView); 

     return view; 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     Log.d(TAG, "onViewCreated_GridViewFragment"); 
     gridView = (GridView) view.findViewById(R.id.careerGridView); 
     gridView.setAdapter(new CareerImageAdapter(getActivity())); 
     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Log.d(TAG, "onItemClick_GridViewFragment position : " + position); 

       // go to workers_list_view_fragment layout 

      } 
     }); 
    } 

GridView控件適配器:

public class CareerImageAdapter extends BaseAdapter { 
    private static final String TAG = "CareerImageAdapter"; 

    private Context mContext; 
    private LayoutInflater layoutInflater; 

    public CareerImageAdapter (Context c){ 
     mContext = c; 
    } 

    @Override 
    public int getCount() { 
     return ImageIdes.length; 
    } 

    @Override 
    public CareerImageAdapter getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView ; 

     if (convertView == null){ 
      convertView= layoutInflater.inflate(R.layout.career_grid_view, null); 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(180, 180)); 
      imageView.setScaleType(ImageView.ScaleType.FIT_END); 
      imageView.setPadding(8, 8, 8, 8); 
     }else { 
      imageView = (ImageView) convertView; 
     } 
     imageView.setImageResource(ImageIdes[position]); 
     return convertView; 
    } 

    private Integer[] ImageIdes = 
      { 
       R.drawable.afar,R.drawable.asbaka,R.drawable.bnya, 
       R.drawable.cnstractors,R.drawable.doors,R.drawable.etom, 
       R.drawable.floring,R.drawable.foxy,R.drawable.garnolet, 
       R.drawable.gaz,R.drawable.geves,R.drawable.ginoon, 
       R.drawable.halbashateven,R.drawable.hashmal,R.drawable.instltsya, 
       R.drawable.kvesatshatyah,R.drawable.mazgan,R.drawable.meshlowah, 
       R.drawable.pargolot,R.drawable.pegom,R.drawable.pinoyafpa, 
       R.drawable.robah,R.drawable.tyah, 
      }; 
} 

回答

2

layoutInflater從不初始化。在CareerImageAdapter構造補充一點:

layoutInflater = LayoutInflater.from(c);

+0

非常感謝你。我是這樣做的,我有另一個例外,鑄造: 'imageView =(ImageView)convertView;我試着在一個空值上調用虛擬方法'void android.widget.ImageView.setImageResource(int)'。我設置了:imageView =(ImageView)convertView.getTag();'它是一個例外:'java.lang.NullPointerException:對象引用'它的行:'imageView.setImageResource(ImageIdes [position]); ' – hasan

+0

如果有幫助,請將其標記爲已回答。關於你的其他崩潰,你不能這樣做。您需要查看您的適配器。這裏是一個示例https://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html。另外,我建議使用RecyclerView而不是舊的GridView。 – allo86

+0

如果你能幫助我,我還有另一個例外嗎? – hasan

相關問題