伙计,
我正面临一个令我疯狂的问题。我知道为什么会这样,但我不知道如何解决这个问题。请帮忙。
我正在编写自己的联系人选择器,其中包含照片缩略图,名称和可以选择的复选框。当用户选择主屏幕上的复选框时,联系选择器活动开始。现在我启动联系人选择器活动并选择几个联系人,即点击几个复选框。当我旋转屏幕时,不再检查这些复选框(请注意我已经实现了在http://androidcocktail.blogspot.it/2012/04/adding-checkboxes-to-custom-listview-in.html中)在自定义列表视图中添加复选框的解决方案。
现在我想这是联系活动oncreate再次调用的结果。以下是联系活动的源代码 -
public class ContactSelectionActivity extends ActionBarActivity {
ContactAdapter contactAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact_selection);
final ListView listView = (ListView) findViewById(R.id.contact);
contactAdapter = new ContactAdapter(this, android.R.layout.simple_list_item_1, getContacts());
listView.setAdapter(contactAdapter);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
所以我做的是介绍对savedInstance的检查。修改后的代码如下所示 -
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact_selection);
if (savedInstanceState == null) {
final ListView listView = (ListView) findViewById(R.id.contact);
contactAdapter = new ContactAdapter(this, android.R.layout.simple_list_item_1, getContacts());
listView.setAdapter(contactAdapter);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
}
现在,联系人活动只是在轮换上消失了。理想情况下,我希望每当我旋转屏幕时都会检查复选框。
编辑:
我刚才注意到,在这两种情况下,我仍旧处理旧的活动,即当我旋转时,我有两个活动,在这两种情况下都清除了所有复选框。
这是Contact Activity类 -
public class ContactSelectionActivity extends ActionBarActivity {
ContactAdapter contactAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact_selection);
final ListView listView = (ListView) findViewById(R.id.contact);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
contactAdapter = new ContactAdapter(this, android.R.layout.simple_list_item_1, getContacts());
listView.setAdapter(contactAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.contact, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.cancel) {
setResult(RESULT_CANCELED, null);
finish();
}
return super.onOptionsItemSelected(item);
}
private ArrayList<Contact> getContacts() {
ArrayList<Contact> contacts = new ArrayList<Contact>();
return contacts;
}
}
这是适配器 -
public class ContactAdapter extends ArrayAdapter<Contact> {
private ArrayList<Contact> contacts = null;
//Now start the holding checkbox value part
boolean[] checkBoxState;
private static class ViewHolder {
ImageView photo;
TextView name;
CheckBox checkBox;
}
ViewHolder viewHolder;
public ContactAdapter(Context ctx, int textViewResourceId,
ArrayList<Contact> data) {
super(ctx, textViewResourceId, data);
contacts = data;
checkBoxState = new boolean[data.size()];
}
@Override
public int getCount() {
return contacts.size();
}
@Override
public Contact getItem(int position) {
return contacts.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int index, View view, ViewGroup parent) {
if (view == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
view = inflater.inflate(R.layout.list_view_contact, parent, false);
viewHolder = new ViewHolder();
viewHolder.photo = (ImageView) view.findViewById(R.id.profile_pic);
viewHolder.name = (TextView) view.findViewById(R.id.contactName);
viewHolder.checkBox = (CheckBox) view.findViewById(R.id.selectContact);
view.setTag(viewHolder);
} else
viewHolder = (ViewHolder) view.getTag();
if (contacts != null) {
Contact contact = contacts.get(index);
if (contact.name != null)
viewHolder.name.setText(contact.name);
else
viewHolder.name.setText("");
if (contact.photoUri != null
&& !contact.photoUri.trim().equalsIgnoreCase("")) {
try {
viewHolder.photo.setImageURI(Uri.parse(contact.photoUri));
} catch (Exception e) {
}
} else
viewHolder.photo.setImageResource(R.drawable.ic_contact_picture);
viewHolder.checkBox.setChecked(checkBoxState[index]);
viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (((CheckBox) v).isChecked())
checkBoxState[index] = true;
else
checkBoxState[index] = false;
}
});
}
return view;
}
}
答案 0 :(得分:0)
你在那里一半。您已检查savedInstanceState是否为null,如果是,则检查该怎么做。但是在轮换之后,savedInstanceState不为null,因此您需要一个else语句并从保存的状态重新膨胀您需要的内容。如果保存的状态包没有您需要的,那么您需要确保在调用onCreate方法之前保存所需的变量状态。
更新:您不需要将整个列表存储在已保存的状态中。当您选中一个复选框时,您必须具有一些您已选择的联系人的标识符。存储所选项的标识符。重新扩充列表视图(如果为空,则为空),然后将已保存标识符的两个联系人设置为已选中。
答案 1 :(得分:0)
这是因为您没有在savedInstanceState
中存储任何内容。您正在直接检查savedInstanceState
是否为null
,它始终为null
,因为您的代码中没有位于savedInstanceState中的任何内容。