Android-无法从ListView中修改对象

Android-无法从ListView中修改对象,android,android-listview,android-arrayadapter,parcelable,Android,Android Listview,Android Arrayadapter,Parcelable,我的无线电机柜故障活动: public class Radio_Cabinet_Defect_Activity extends Activity { private ListView mList; private CabinetDefectAdapter mCabinetDefectAdapter; private RadioSiteSubsection mRadioSiteSubsection; @Override protected void o

我的
无线电机柜故障活动

public class Radio_Cabinet_Defect_Activity extends Activity {

    private ListView mList;
    private CabinetDefectAdapter mCabinetDefectAdapter;

    private RadioSiteSubsection mRadioSiteSubsection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_radio__cabinet__defect);

        Intent i = getIntent();
        if (i.hasExtra("radio_site_subsection_data")) {
            mRadioSiteSubsection = i.getParcelableExtra("radio_site_subsection_data");
        }

        mList = (ListView) findViewById(R.id.cabinet_defect_list);

        TextView title = (TextView) findViewById(R.id.cabinet_point_title);
        title.setText(mRadioSiteSubsection.getSubsectionNum() + " " + mRadioSiteSubsection.getName());

        TextView description = (TextView) findViewById(R.id.cabinet_point_description);
        description.setText(mRadioSiteSubsection.getDescription());

        CheckBox okCheckBox = (CheckBox) findViewById(R.id.checkbox_point_ok);
        okCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                ArrayList<Severity> severities = mRadioSiteSubsection.getGlobalSeverities();
                severities.get(SeverityList.OK.intValue()).setChecked(isChecked);

                // If we checked OK, then other checkboxes must be unchecked
                if (isChecked) {
                    for (int i = SeverityList.CRITICAL.intValue(); i < severities.size(); ++i) {
                        severities.get(i).setChecked(false);
                    }
                }

                mRadioSiteSubsection.setGlobalSeverities(severities);
            }
        });

        Button backBtn = (Button) findViewById(R.id.cabinet_point_back_btn);
        backBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

    @Override
    public void onBackPressed() {

    }

    @Override
    public void onResume() {
        super.onResume();

        mCabinetDefectAdapter = new CabinetDefectAdapter(Radio_Cabinet_Defect_Activity.this,
                mRadioSiteSubsection.getDefects());

        mList.setOnItemClickListener(null);
        mList.setAdapter(mCabinetDefectAdapter);

        mCabinetDefectAdapter.notifyDataSetChanged();
    }
}
public class Radio_Cabinet_Activity extends Activity {

private ListView mList;
private CabinetAdapter mCabinetAdapter;

private RadioSite mCabinetData;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_radio__cabinet_);

    mList = (ListView) findViewById(R.id.cabinet_list);

    loadCabinetData();

    mCabinetAdapter = new CabinetAdapter(Radio_Cabinet_Activity.this, mCabinetData.getSubsections());

    mList.setOnItemClickListener(null);
    mList.setAdapter(mCabinetAdapter);

    Button backBtn = (Button) findViewById(R.id.cabinet_back_btn);
    backBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

@Override
public void onBackPressed() {

}

private void loadCabinetData() {
    if (mCabinetData == null) {
        mCabinetData = new RadioSite();
    }

    String[] radio_site_list = getResources().getStringArray(R.array.radio_site_list);
    String[] radio_severity_list = getResources().getStringArray(R.array.radio_severity_list);

    mCabinetData.setId(RadioSiteList.CABINET.intValue());
    mCabinetData.setName(radio_site_list[RadioSiteList.CABINET.intValue()]);

    String[] cabinet_categories = getResources().getStringArray(R.array.cabinet_categories);
    String[] cabinet_categories_details = getResources().getStringArray(R.array.cabinet_categories_details);

    // Add subsections
    ArrayList<RadioSiteSubsection> cabinet_subsections = new ArrayList<RadioSiteSubsection>(
            cabinet_categories.length);
    for (int i = 0; i < cabinet_categories.length; ++i) {
        RadioSiteSubsection subsection = new RadioSiteSubsection();

        subsection.setSubsectionNum((RadioSiteList.CABINET.intValue() + 1) + "." + (i + 1));
        subsection.setName(cabinet_categories[i]);
        subsection.setDescription(cabinet_categories_details[i]);

        // Add severities
        ArrayList<Severity> global_severities = new ArrayList<Severity>(radio_severity_list.length);
        for (int j = 0; j < radio_severity_list.length; ++j) {
            Severity severity = new Severity();
            severity.setName(radio_severity_list[j]);

            global_severities.add(severity);
        }

        subsection.setGlobalSeverities(global_severities);

        // Add defects for this subsection
        ArrayList<RadioSiteDefect> cabinet_sub_defects = new ArrayList<RadioSiteDefect>();
        String[] defect_list = getResources().getStringArray(CommonResources.getCabinetDefectList(i));

        for (int j = 0; j < defect_list.length; ++j) {
            RadioSiteDefect defect = new RadioSiteDefect();
            defect.setDefectNum((RadioSiteList.CABINET.intValue() + 1) + "." + (i + 1) + "." + (j + 1));

            String[] defectStr = defect_list[j].split("\\|");
            defect.setDescription(defectStr[0]);

            Severity severity = new Severity();
            severity.setName(defectStr[1]);

            defect.setSeverity(severity);

            cabinet_sub_defects.add(defect);
        }

        subsection.setDefects(cabinet_sub_defects);

        cabinet_subsections.add(subsection);
    }

    mCabinetData.setSubsections(cabinet_subsections);
}
此适配器与自定义视图
R.layout.radio\u cabinet\u defect\u项支持的列表视图链接

当我按下复选框时,我会更新对象上相应的复选框标志。但在
无线电\u机柜\u缺陷\u活动
上,对象保持不变。有没有办法修改对象,或者我完全没有抓住要点

提前谢谢

编辑

我错过了一个重要的部分。所有操作都从该活动开始(
无线电机柜故障活动
):

如您所见,我将
RadioSite
的子对象
RadioSite子部分
传递给
Radio\u Cabinet\u Defect\u活动
(前面发布的活动)。我想要的是,当我返回到
Radio\u Cabinet\u活动时
,我希望
RadioSite
中有更新的值。我希望我已经很好地解释了情况

编辑2

谢谢@Sufian。要重新设置上限,我有一个主要活动,即具有
RadioSite
对象的
Radio\u Cabinet\u活动

RadioSite
对象具有多个子对象。因此,我将
RadioSite
子对象列表的
RadioSite
传递给
CabinetAdapter
以在
Listview
中显示它。在
CabinetAdapter
内部,我有一个
OnClickListener
,其中我将单个
radiosite子节
对象传递到下一个活动
Radio\u Cabinet\u Defect\u活动
。在本活动中,我有另一个适配器
Cabinet\u Defect\u adapter
,其中我传递了一个名为
radiositeffect
radiositeffect子对象列表。在最后一个适配器中,我有一个用于复选框的
OnCheckedChangeListener
,当调用它时,我更新
RadioSiteDefect
对象上的相应字段。理想的最终情况是,当我返回到
无线电机柜活动时,修改原始的
无线电站点
对象


我知道这有点扭曲:)

问题不在于如何取回复选框值,而在于如何从
列表视图中的复选框中获取更新值并将其保存在我的对象上(然后将更新后的对象转移到上一个活动)

我通过调用
ListView
getItem()
方法解决了这个问题,因此我能够获得更新的元素


感谢您的支持。

您知道android中的视图回收吗?是的,我知道回收。所以没有办法在ListView中修改对象?您已经发布了很多代码。如果您只发布所需的代码片段会更好。无论如何,您已经发布了两个不同的
活动代码。他们是同一个班吗?好的,我知道了。让我检查一下。保存/获取
复选框的状态是一个老问题。你会发现很多关于它的问题。如果你提供了它的来源会更好。
public class Radio_Cabinet_Activity extends Activity {

private ListView mList;
private CabinetAdapter mCabinetAdapter;

private RadioSite mCabinetData;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_radio__cabinet_);

    mList = (ListView) findViewById(R.id.cabinet_list);

    loadCabinetData();

    mCabinetAdapter = new CabinetAdapter(Radio_Cabinet_Activity.this, mCabinetData.getSubsections());

    mList.setOnItemClickListener(null);
    mList.setAdapter(mCabinetAdapter);

    Button backBtn = (Button) findViewById(R.id.cabinet_back_btn);
    backBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

@Override
public void onBackPressed() {

}

private void loadCabinetData() {
    if (mCabinetData == null) {
        mCabinetData = new RadioSite();
    }

    String[] radio_site_list = getResources().getStringArray(R.array.radio_site_list);
    String[] radio_severity_list = getResources().getStringArray(R.array.radio_severity_list);

    mCabinetData.setId(RadioSiteList.CABINET.intValue());
    mCabinetData.setName(radio_site_list[RadioSiteList.CABINET.intValue()]);

    String[] cabinet_categories = getResources().getStringArray(R.array.cabinet_categories);
    String[] cabinet_categories_details = getResources().getStringArray(R.array.cabinet_categories_details);

    // Add subsections
    ArrayList<RadioSiteSubsection> cabinet_subsections = new ArrayList<RadioSiteSubsection>(
            cabinet_categories.length);
    for (int i = 0; i < cabinet_categories.length; ++i) {
        RadioSiteSubsection subsection = new RadioSiteSubsection();

        subsection.setSubsectionNum((RadioSiteList.CABINET.intValue() + 1) + "." + (i + 1));
        subsection.setName(cabinet_categories[i]);
        subsection.setDescription(cabinet_categories_details[i]);

        // Add severities
        ArrayList<Severity> global_severities = new ArrayList<Severity>(radio_severity_list.length);
        for (int j = 0; j < radio_severity_list.length; ++j) {
            Severity severity = new Severity();
            severity.setName(radio_severity_list[j]);

            global_severities.add(severity);
        }

        subsection.setGlobalSeverities(global_severities);

        // Add defects for this subsection
        ArrayList<RadioSiteDefect> cabinet_sub_defects = new ArrayList<RadioSiteDefect>();
        String[] defect_list = getResources().getStringArray(CommonResources.getCabinetDefectList(i));

        for (int j = 0; j < defect_list.length; ++j) {
            RadioSiteDefect defect = new RadioSiteDefect();
            defect.setDefectNum((RadioSiteList.CABINET.intValue() + 1) + "." + (i + 1) + "." + (j + 1));

            String[] defectStr = defect_list[j].split("\\|");
            defect.setDescription(defectStr[0]);

            Severity severity = new Severity();
            severity.setName(defectStr[1]);

            defect.setSeverity(severity);

            cabinet_sub_defects.add(defect);
        }

        subsection.setDefects(cabinet_sub_defects);

        cabinet_subsections.add(subsection);
    }

    mCabinetData.setSubsections(cabinet_subsections);
}
public class CabinetAdapter extends ArrayAdapter<RadioSiteSubsection> {

    private final Context mContext;
    private final String[] mRadioSeverityList;

    static class ViewHolder {
        public TextView mText;
        public Button mCabinetBtn;
        public Button mCabinetNotesBtn;
        public Button mCabinetImgBtn;
        public CheckBox[] mCabinetChkBox;
    }

    public CabinetAdapter(Context context, List<RadioSiteSubsection> radio_site_subsections) {
        super(context, R.layout.radio__cabinet_item, radio_site_subsections);
        this.mContext = context;
        this.mRadioSeverityList = mContext.getResources().getStringArray(R.array.radio_severity_list);
    }

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

        View rowView = convertView;

        // reuse views
        if (rowView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.radio__cabinet_item, parent, false);

            // configure view holder
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.mText = (TextView) rowView.findViewById(R.id.cabinet_desc);
            viewHolder.mCabinetBtn = (Button) rowView.findViewById(R.id.cabinet_btn);
            viewHolder.mCabinetNotesBtn = (Button) rowView.findViewById(R.id.cabinet_btn_notes_obs);
            viewHolder.mCabinetImgBtn = (Button) rowView.findViewById(R.id.cabinet_btn_image);

            viewHolder.mCabinetChkBox = new CheckBox[CommonResources.getRadioCheckboxLength()];

            for (int i = 0; i < mRadioSeverityList.length; ++i) {
                viewHolder.mCabinetChkBox[i] = (CheckBox) rowView.findViewById(CommonResources.getRadioCheckboxRes(i));
            }

            rowView.setTag(viewHolder);
        }

        // fill data
        ViewHolder holder = (ViewHolder) rowView.getTag();

        final RadioSiteSubsection radio_site_subsection = super.getItem(position);
        holder.mText.setText(radio_site_subsection.getSubsectionNum() + " " + radio_site_subsection.getName());
        holder.mCabinetBtn.setText(radio_site_subsection.getSubsectionNum());


        holder.mCabinetBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, Radio_Cabinet_Defect_Activity.class);
                intent.putExtra("radio_site_subsection_data", radio_site_subsection);
                mContext.startActivity(intent);
            }
        });

        holder.mCabinetNotesBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, NotesObservationActivity.class);
                intent.putExtra("radio_site_subsection_data", radio_site_subsection);
                mContext.startActivity(intent);
            }
        });

        return rowView;
    }
}