我有一个适配器,它为listView显示两个视图 - 一个checkedtextview和一个普通的textview。当用户在MarkMode
时,我想使用checkedtextview,这样他/她可以标记项目,我想在用户不在MarkMode
时使用textview。
所以这是我的原始代码,只有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错误,指出此行上有一个NullPointerException
:result.setText(contactRow);
我该如何解决这个问题?任何帮助将不胜感激。
答案 0 :(得分:1)
result
为inMarkMode
时, false
未初始化。因此,如果在result.setText(contactRow);
为inMarkMode
true
时阻止,则将 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);
}
移到内部:
{{1}}
答案 1 :(得分: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;
}
}
}