【问题标题】:Checkboxes in listview are reset onPause of androidlistview中的复选框在android的Pause上被重置
【发布时间】:2015-06-30 04:14:50
【问题描述】:

我有什么: 带有复选框的列表视图托管在活动中

发生了什么:

  1. onPause 发生,屏幕恢复,复选框被重新设置 回到原来的状态

  2. 如何解决这个问题


活动中

AdptHomeDetail serialNumbers = new AdptHomeDetail(ActMyOrderDetail.this, result.getMyOrderDetails().getSerialNumbers());
lstVwId.setAdapter(serialNumbers);

在适配器中

AdptHomeDetail.java

public class AdptHomeDetail extends BaseAdapter {

    ArrayList<SerialNumbers> mSerialNumbers;

    private Context mContext = null;

    public AdptHomeDetail(Context context, ArrayList<SerialNumbers> serialNo) {
        super();
        mContext = context;
        mSerialNumbers = serialNo;

    }

    public int getCount() {
        return mSerialNumbers.size();
    }

    public SerialNumbers getItem(int position) {
        return mSerialNumbers.get(position);
    }

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

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

        View view = convertView;

        final ViewHolder vHolder;
        if (convertView == null) {
            LayoutInflater layout = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = layout.inflate(R.layout.adp_act_myorder_detail, null);
            vHolder = new ViewHolder(view);
            view.setTag(vHolder);

            vHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                    mSerialNumbers.get(getPosition).setIsChecked(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
                }
            });

            view.setTag(R.id.checkBox, vHolder.checkBox);

        } else {
            vHolder = (ViewHolder) view.getTag();
        }

        vHolder.checkBox.setTag(position); // This line is important.
        vHolder.checkBox.setChecked(mSerialNumbers.get(position).isChecked()); // Restore the maintained checkbox state

        vHolder.txtNameId.setText(mSerialNumbers.get(position).getProduct().getName()) ;
        vHolder.txtSlnoId.setText(mContext.getResources().getString(R.string.myOrderDetailSlnoTag) + " " + mSerialNumbers.get(position).getSerial_num() + "") ;

        return view;
    }

    class ViewHolder {

        private TextView txtNameId,txtSlnoId;
        CheckBox checkBox;

        public ViewHolder(View base) {


     txtNameId = (TextView) base.findViewById(R.id.txtNameId);
        txtSlnoId = (TextView) base.findViewById(R.id.txtSlnoId);
        checkBox = (CheckBox) base.findViewById(R.id.checkBox);
    }
}

}

【问题讨论】:

    标签: android listview checkbox


    【解决方案1】:

    onPause 发生并且屏幕恢复复选框被重新设置 回到原来的状态

    这是正常行为。上面没有一个答案不起作用(正常工作)。您需要做的是使用 onSaveInstanceState() 其中 您将在 ListView 或您正在使用的任何 AdapterView 中存储您的选择,然后在 onCreate() “重新生成”您的选择.

    因此,在适配器中,您可以将检查状态保存到 SparseBooleanArray 中,您将在其中存储复选框的位置和选中/未选中状态。

    onSaveInstanceState() 方法中,您将存储它们。

    onCreate() 方法中,您将重新生成它:

    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // init widgets
    
       // after activity was re-created during rotation
       if (savedInstanceState != null) {
          // restore your selections in Adapter
       }
    }
    

    这应该可以解决您面临的问题。

    更新:

    是否有任何示例显示如何使用 sparce boolean arry

    基本上,您只需要创建例如 onCheckedChangeListener 并将其附加到 AdapterView 中每一行的复选框中。在此侦听器中,您将使用项目的当前位置和选中/未选中状态:

    check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
       @Override
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          mSparseArray.put(position, isChecked); 
       }
    });
    

    您可以在 getView() 方法中直接获得的位置和 isChecked 状态是复选框的当前状态作为方法参数。

    【讨论】:

    • 谢谢! [+1] ...是否有任何示例显示如何在stackoverflow或其他地方使用sparce boolean arry来解决这个用例
    【解决方案2】:

    您可以创建一个扩展类“应用程序”的类并将复选框的状态保存在那里,以便您的活动的 onResume 可以恢复您的复选框的状态

    【讨论】:

      【解决方案3】:

      尝试在您的 onResume() 方法中调用 adapter.notifyDataSetChanged()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-14
        • 2015-06-07
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 2011-07-31
        相关资源
        最近更新 更多