2016-10-03 120 views
0

我在android中創建自定義ListView。我面臨的問題是在我的適配器代碼中。它拋出一個NullPointerException,即使其他一切似乎都是按順序的。下面的示例代碼:自定義列表視圖拋出空指針異常

public class CustomAdapter extends BaseAdapter { 

    private Context ctx; 
    private List<LearnLangs> langsList; 
    private LayoutInflater layoutInflater; 

    public CustomAdapter(Context ctx, List<LearnLangs> langsList) { 
     this.ctx = ctx; 
     this.langsList = langsList; 
    } 

    @Override 
    public int getCount() { 
     return langsList.size(); 
    } 

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

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

    public static class ViewHolder{ 

     public ImageView img; 
     public TextView title; 
     public TextView sub; 
    } 

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

     ViewHolder holder; 
     LearnLangs langs = langsList.get(position); 

     if (convertView == null) { 
      layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      layoutInflater.inflate(R.layout.custom_list, parent, false); 

      holder = new ViewHolder(); 
      //error occurs on this line below 
      holder.img = (ImageView) convertView.findViewById(R.id.list_img); 
      holder.title = (TextView) convertView.findViewById(R.id.list_title); 
      holder.sub = (TextView) convertView.findViewById(R.id.list_subT); 

      convertView.setTag(holder); 
     } 

     else 
     { 
      holder = (ViewHolder) convertView.getTag(); 

      holder.img.setImageResource(langs.getImgId()); 
      holder.title.setText(langs.getNameLang()); 
      holder.sub.setText(langs.getnTuts()); 
     } 
     return convertView; 
    } 
} 

拋出異常:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                      at com.example.joey.sunshine.CustomAdapter.getView(CustomAdapter.java:62) 
                      at android.widget.AbsListView.obtainView(AbsListView.java:2347) 
                      at android.widget.ListView.makeAndAddView(ListView.java:1864) 
                      at android.widget.ListView.fillDown(ListView.java:698) 
                      at android.widget.ListView.fillFromTop(ListView.java:759) 
                      at android.widget.ListView.layoutChildren(ListView.java:1673) 
                      at android.widget.AbsListView.onLayout(AbsListView.java:2151) 
                      at android.view.View.layout(View.java:15761) 

出了什麼問題?

回答

0

你會得到異常,因爲你沒有使用視圖,而你正在充氣。更改getview()方法的代碼按如下:

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

    View mView = convertView; 
    ViewHolder holder; 
    LearnLangs langs = langsList.get(position); 

    if (mView == null) { 
     layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mView = layoutInflater.inflate(R.layout.custom_list, parent, false); 

     holder = new ViewHolder(); 
     //error occurs on this line below 
     holder.img = (ImageView) mView.findViewById(R.id.list_img); 
     holder.title = (TextView) mView.findViewById(R.id.list_title); 
     holder.sub = (TextView) mView.findViewById(R.id.list_subT); 

     mView.setTag(holder); 
    } 

    else 
    { 
     holder = (ViewHolder) mView.getTag(); 

     holder.img.setImageResource(langs.getImgId()); 
     holder.title.setText(langs.getNameLang()); 
     holder.sub.setText(langs.getnTuts()); 
    } 
    return mView; 
} 
+0

感謝它指向了 –

+0

@JosephJoey:你可以接受的答案! :) – Jai

0

只是改變這一行:

layoutInflater.inflate(R.layout.custom_list, parent, false); 

這樣:

convertView = layoutInflater.inflate(R.layout.custom_list, parent, false); 

編輯

public AdapterConstructor() { 
    layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //move this line inside the constructor 
} 

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

    ViewHolder holder; 
    LearnLangs langs = langsList.get(position); 

    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.custom_list, parent, false); 

     holder = new ViewHolder(); 
     //error occurs on this line below 
     holder.img = (ImageView) convertView.findViewById(R.id.list_img); 
     holder.title = (TextView) convertView.findViewById(R.id.list_title); 
     holder.sub = (TextView) convertView.findViewById(R.id.list_subT); 

     convertView.setTag(holder); 
    } 

    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

     holder.img.setImageResource(langs.getImgId()); 
     holder.title.setText(langs.getNameLang()); 
     holder.sub.setText(langs.getnTuts()); 
    return convertView; 
} 
+0

執行此更改後屏幕只是空白,但未顯示錯誤。什麼可能導致這個問題? –

+0

@JosephJoey看看我編輯的答案 –

0

只是通過下面更改getView()方法:

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

    ViewHolder holder; 
    LearnLangs langs = langsList.get(position); 

    if (convertView == null) { 
     layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = layoutInflater.inflate(R.layout.custom_list, parent, false); 

     holder = new ViewHolder(); 
     //error occurs on this line below 
     holder.img = (ImageView) convertView.findViewById(R.id.list_img); 
     holder.title = (TextView) convertView.findViewById(R.id.list_title); 
     holder.sub = (TextView) convertView.findViewById(R.id.list_subT); 

     convertView.setTag(holder); 
    } 

    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.img.setImageResource(langs.getImgId()); 
    holder.title.setText(langs.getNameLang()); 
    holder.sub.setText(langs.getnTuts()); 

    return convertView; 
}