2013-10-12 22 views
0

我有一個適配器顯示兩個視圖的ListView - 一個checkedtextview和一個普通的textview。我想在用戶處於01​​時使用checkedtextview,因此他/她可以標記項目,並且當用戶不在MarkMode中時我想使用textview。Android:適配器顯示兩個不同的視圖,但得到空指針

所以這裏是我的原代碼,它只有MarkMode

public class ContactsAdapter extends BaseAdapter { 

    private List<Contact> mData; 
    private LayoutInflater mInflater; 
    private Context context; 

    public ContactsAdapter(List<Contact> mData, Context context) { 
     this.mData = mData; 
     this.context = context; 
     mInflater = LayoutInflater.from(context); 
    } 

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

    @Override 
    public String getItem(int position) { 
     switch (context.getSharedPreferences("settings", 
       HomeScreenActivity.MODE_PRIVATE).getInt("displayChoice", -1)) { 
     case 1: 
      return mData.get(position).getLastName() + " " 
        + mData.get(position).getFirstName(); 
     case 2: 
      return mData.get(position).getFirstName() + " " 
        + mData.get(position).getMobileNumber(); 
     case 3: 
      return mData.get(position).getLastName() + " " 
        + mData.get(position).getMobileNumber(); 
     default: 
      return mData.get(position).getFirstName() + " " 
        + mData.get(position).getLastName(); 
     } 
    } 

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

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

     CheckedTextView result; 

     if (convertView == null) { 
      result = (CheckedTextView) mInflater.inflate(
        R.layout.home_screen_contacts_mark_view, parent, false); 
     } else { 
      result = (CheckedTextView) convertView; 
     } 

     final String contactRow = getItem(position); 
     result.setText(contactRow); 
     result.setBackgroundResource(R.drawable.list_selector); 

     return result; 
    } 

} 

現在我改成了這個,所以我可以改叫isMarkMode所以它顯示了不同的看法類變量...

public class ContactsAdapter extends BaseAdapter { 

    private List<Contact> mData; 
    private LayoutInflater mInflater; 
    private Context context; 
    public static boolean inMarkMode = false; 
    public ContactsAdapter(List<Contact> mData, Context context) { 
     this.mData = mData; 
     this.context = context; 
     mInflater = LayoutInflater.from(context); 
    } 

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

    @Override 
    public String getItem(int position) { 
     switch (context.getSharedPreferences("settings", 
       HomeScreenActivity.MODE_PRIVATE).getInt("displayChoice", -1)) { 
     case 1: 
      return mData.get(position).getLastName() + " " 
        + mData.get(position).getFirstName(); 
     case 2: 
      return mData.get(position).getFirstName() + " " 
        + mData.get(position).getMobileNumber(); 
     case 3: 
      return mData.get(position).getLastName() + " " 
        + mData.get(position).getMobileNumber(); 
     default: 
      return mData.get(position).getFirstName() + " " 
        + mData.get(position).getLastName(); 
     } 
    } 

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

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

       CheckedTextView result = null; 
     TextView normalResult = null; 

     if (inMarkMode) { 
      if (convertView == null) { 
       result = (CheckedTextView) mInflater.inflate(
         R.layout.home_screen_contacts_mark_view, parent, false); 
      } else { 
       result = (CheckedTextView) convertView; 
      } 
     } else { 
      if (convertView == null) { 
       normalResult = (TextView) mInflater.inflate(
         R.layout.home_screen_contacts_view, parent, false); 
      } else { 
       normalResult = (TextView) convertView; 
      } 
     } 
     final String contactRow = getItem(position); 
     result.setText(contactRow); 
     result.setBackgroundResource(R.drawable.list_selector); 
     normalResult.setText(contactRow); 
     normalResult.setBackgroundResource(R.drawable.list_selector); 

     if (inMarkMode) { 
      return result; 
     } else { 
      return normalResult; 
     } 
    } 
    } 

} 

最初,它看起來像它的工作,但隨後停止,我得到一個logcat錯誤,說這條線上有一個NullPointerExceptionresult.setText(contactRow);

我該如何解決這個問題?任何幫助,將不勝感激。

+0

@ρяσѕρєяK謝謝你的作品。當日食不指出他們哈哈時,很難發現這些錯誤。如果你張貼你的答案,我可以接受它 – Ogen

回答

1

resultinMarkModefalse時未初始化。因此,如果塊內移動result.setText(contactRow);inMarkModetrue爲:

final String contactRow = getItem(position); 
if (inMarkMode) { 
      //.....your code here.. 
      result.setText(contactRow); 
      result.setBackgroundResource(R.drawable.list_selector); 
    } else { 
      //.....your code here.. 
      normalResult.setText(contactRow); 
      normalResult.setBackgroundResource(R.drawable.list_selector); 
     } 
0

改變你的Getview方法本

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

      CheckedTextView result = null; 
      TextView normalResult = null; 

      if (inMarkMode) { 
       if (convertView == null) { 
        result = (CheckedTextView) mInflater.inflate(
          R.layout.home_screen_contacts_mark_view, parent, false); 
       } else { 
        result = (CheckedTextView) convertView; 
       } 
      } else { 
       if (convertView == null) { 
        normalResult = (TextView) mInflater.inflate(
          R.layout.home_screen_contacts_view, parent, false); 
       } else { 
        normalResult = (TextView) convertView; 
       } 

      } 
final String contactRow = getItem(position); 

      if (inMarkMode) { 

      result.setText(contactRow); 
      result.setBackgroundResource(R.drawable.list_selector); 
       return result; 
      } else { 
      normalResult.setText(contactRow); 
      normalResult.setBackgroundResource(R.drawable.list_selector); 
       return normalResult; 
      } 
     } 
     } 
相關問題