活动变得空白

时间:2014-11-22 14:24:47

标签: android

伙计,

我正面临一个令我疯狂的问题。我知道为什么会这样,但我不知道如何解决这个问题。请帮忙。

问题

我正在编写自己的联系人选择器,其中包含照片缩略图,名称和可以选择的复选框。当用户选择主屏幕上的复选框时,联系选择器活动开始。现在我启动联系人选择器活动并选择几个联系人,即点击几个复选框。当我旋转屏幕时,不再检查这些复选框(请注意我已经实现了在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;
}
}

2 个答案:

答案 0 :(得分:0)

你在那里一半。您已检查savedInstanceState是否为null,如果是,则检查该怎么做。但是在轮换之后,savedInstanceState不为null,因此您需要一个else语句并从保存的状态重新膨胀您需要的内容。如果保存的状态包没有您需要的,那么您需要确保在调用onCreate方法之前保存所需的变量状态。

更新:您不需要将整个列表存储在已保存的状态中。当您选中一个复选框时,您必须具有一些您已选择的联系人的标识符。存储所选项的标识符。重新扩充列表视图(如果为空,则为空),然后将已保存标识符的两个联系人设置为已选中。

答案 1 :(得分:0)

这是因为您没有在savedInstanceState中存储任何内容。您正在直接检查savedInstanceState是否为null,它始终为null,因为您的代码中没有位于savedInstanceState中的任何内容。