Android列表数据动态改变

来源:互联网 发布:java大量线程wait状态 编辑:程序博客网 时间:2024/06/03 23:46

         自己的项目当中遇到了这样一个问题,列表是动态加载的,而且listview的每个item上有动态生成的按钮,当点击按钮后会进行一系列操作,然后改变当前当前列表而不跳转,具体情况如下:

         我这里获取到了一个设备列表:

         

         设备列表中的每一项都有一个“修正”按钮,当点击修正以后,问题列表中的问题会自动减少一些,而页面不跳转。

         

         之前我的设计方案是,修正后,跳转到当前页面,并传递所需要的参数,代码如下:

@Override    public View getView(int position, View convertView, ViewGroup parent) {                ViewHolder holder = new ViewHolder();        if(convertView==null) {            holder = new ViewHolder();            convertView = layoutInflater.inflate(R.layout.problem_checklist_item, null);                        holder.position1 = (TextView) convertView.findViewById(R.id.position1);            holder.position2 = (TextView) convertView.findViewById(R.id.position2);            holder.standardName = (TextView) convertView.findViewById(R.id.checkstandard);            holder.modifyBtn = (Button) convertView.findViewById(R.id.modify_btn);            //data.get(position).get("");                        convertView.setTag(holder);        }else {            holder = (ViewHolder)convertView.getTag();        }                System.out.println("position----------------->"+position);        holder.position1.setText((String)data.get(position).get("dept1"));        holder.position2.setText((String)data.get(position).get("dept2"));        holder.standardName.setText((String)data.get(position).get("checkStandard"));        HashMap<String,Object> map = data.get(position);        final int p = position;        //data.remove(position);        final String id = (String)map.get("id");        final String equipId = (String)map.get("equipId");        final String equipNo = (String)map.get("equipNo");        holder.modifyBtn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                // 修改检查结果                System.out.println("id--------------------->"+id);                RealCheckDBManager manager = new RealCheckDBManager(context);                String code = manager.getResultCode("优");                String deptId = manager.getDeptId(id);                String checkDate = manager.getCheckDate(id);                String checkNum = manager.getCheckNum(id);                manager.setDetailScore(code, id);                                String goodcode = manager.getResultCode("优");                String checkId = manager.getCheckId(id);                // 遍历Z_CHECK_SCORE_DETAIL表,查看是否都为OK,若是,这把Z_CHECK_SCORE的相应字段也置为OK                detailList = manager.getCheckDetailList(checkId);                boolean isOk = true;                for(CheckScoreDetailInfo info : detailList) {                    if(!goodcode.equals(info.getCheckResult())) {                        isOk = false;                        break;                    }                }                if(isOk) {                    manager.setScore("", goodcode, checkId);                }                                Toast.makeText(context, "修改成功!", Toast.LENGTH_LONG).show();                Intent intent = new Intent(context,RealCheckProblemListActivity.class);                // 根据ID获取Z_CHECK_SCORE表的信息                intent.putExtra("deptId", deptId);                intent.putExtra("checkDate", checkDate);                intent.putExtra("checkNum", checkNum);                intent.putExtra("id", checkId);                intent.putExtra("equipId", equipId);                intent.putExtra("equipNo", equipNo);                context.startActivity(intent);                RealCheckProblemListActivity activity = (RealCheckProblemListActivity)context;                activity.finish();            }                    });        return convertView;    }


         其实这样做不是不可以,但是用户体验就比较差了,应该明显有一个页面跳转的动作在里面,一下子就看出来了,而且如果传递的参数较多,页面的OnCreate方法中做的事情过多就会进一步延迟速度,破坏用户体验,因此应该寻找更好的替代方案。

         ListView的显示一般都是通过Adapter来加载数据的,那么Adapter就天然的为我们提供了一个好的方法,就是notifyDataSetChanged(),只要在数据发生改变后,主动调用该方法那么就可以实现当前页面数据的改变而不用调整页面,这个效果有点类似Web开发中的AJAX技术的感觉,满满的AJAX即视感啊,代码如下:

        

        @Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = new ViewHolder();if(convertView==null) {holder = new ViewHolder();convertView = layoutInflater.inflate(R.layout.problem_checklist_item, null);holder.position1 = (TextView) convertView.findViewById(R.id.position1);holder.position2 = (TextView) convertView.findViewById(R.id.position2);holder.standardName = (TextView) convertView.findViewById(R.id.checkstandard);holder.modifyBtn = (Button) convertView.findViewById(R.id.modify_btn);//data.get(position).get("");convertView.setTag(holder);}else {holder = (ViewHolder)convertView.getTag();}System.out.println("position----------------->"+position);holder.position1.setText((String)data.get(position).get("dept1"));holder.position2.setText((String)data.get(position).get("dept2"));holder.standardName.setText((String)data.get(position).get("checkStandard"));HashMap<String,Object> map = data.get(position);final int p = position;//data.remove(position);final String id = (String)map.get("id");final String equipId = (String)map.get("equipId");final String equipNo = (String)map.get("equipNo");holder.modifyBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// 修改检查结果System.out.println("id--------------------->"+id);RealCheckDBManager manager = new RealCheckDBManager(context);String code = manager.getResultCode("优");String deptId = manager.getDeptId(id);String checkDate = manager.getCheckDate(id);String checkNum = manager.getCheckNum(id);manager.setDetailScore(code, id);String goodcode = manager.getResultCode("优");String checkId = manager.getCheckId(id);// 遍历Z_CHECK_SCORE_DETAIL表,查看是否都为OK,若是,这把Z_CHECK_SCORE的相应字段也置为OKdetailList = manager.getCheckDetailList(checkId);boolean isOk = true;for(CheckScoreDetailInfo info : detailList) {if(!goodcode.equals(info.getCheckResult())) {isOk = false;break;}}if(isOk) {manager.setScore("", goodcode, checkId);}Toast.makeText(context, "修改成功!", Toast.LENGTH_LONG).show();<span style="background-color: rgb(255, 255, 51);">data.remove(p);</span> // 数据改变<span style="background-color: rgb(255, 255, 51);">notifyDataSetChanged();</span> // 通知数据已经改变}});return convertView;}

@Overridepublic void notifyDataSetChanged() {// TODO Auto-generated method stubsuper.notifyDataSetChanged();}

这样就可以了。

0 0