安卓小日记练习(10)listview之item的动态改变

来源:互联网 发布:google 财务分析软件 编辑:程序博客网 时间:2024/04/30 10:24

我们的小日记,编辑之后是一个框框,里面有内容,编辑之后是一个小黑点,我们本来是直接将点击小黑点进入的编辑界面的内容保存在文件里的。

但是我们更重要的是要返回到主界面,并且将小黑点变为框框。

编辑文本(日记具体内容)之后,点击done,回到主界面,点击主界面最左下角的小竖条更新list。,主界面的的小黑点item,变成日记框。


二.思路分析

1.本来的思路是,这边活动的用更新的数据新建一个Day对象(Day描述的是主界面日记item小框中的信息),然后存入本地文件,接着在主界面从文件中取出数据,然后将list中的这一个Point对象(描述的是未编辑的日记,即小黑点),替换成新建的Day对象。

 

2.检查思路可行性和可优化性,可行性的问题是主界面更新List的代码不会被调用,考虑活动的oncreate方法一定会被调用,再考虑可优化性,想有没有更简单的办法,于是想到可以用intent传递数据,startActivity回到主界面。于是写代码并运行实验。

 

3.实验结果是没有产生效果,分析有至少三种可能,一种是再次执行intit()由变回去了,一种是setAdapter没有执行,一种是data没有序列化,利用设置断点,多点设置输出和控制变量等等办法,发现应该是新启动了一个活动,而不是回到了。最终否决此种办法,并重定办法

 

4,作出改进:(1)list定为static全局变量,单独放在一个类中,这样就可以在编辑界面直接更新,然后直接传输跟新后的list(这样可以直接重用代码)。(2)因为传输的list既装了day又装了point,所以是object类型的,但是这个类型没有序列化,所以重新定义一个Data类,实现序列化接口,并让point和day继承之。(3)init设置标签,让它只执行一次。(4)设置主界面最左下方的点击事件,更新界面,确保更新执行。

 

5.出现错误:功能不能实现,点击之后,List没有变化,通过在数据处理和传输的各个结点设置输出,发现if语句没有执行,但是输出显示if语句中比较的两个String的值是相等的,恍然大悟,自己写的是if(s1 == s2)(前段时间写惯了c++),java应该是if(s1.equals(s2))

,改过之后,终于解决问题。

三.关键实现代码

public class Data implements Serializable


全局静态变量(类中):


public class ListAll {public static ArrayList<Day> daylist = new ArrayList<Day>();public static ArrayList<Point> pointlist = new ArrayList<Point>();public static ArrayList<Data> data = new ArrayList<Data>();}编辑活动中:(save方法的实现在上一篇博文中贴出)ImageView iv =(ImageView)findViewById(R.id.iddone);iv.setOnClickListener(new View.OnClickListener()        {        @Override        public void onClick(View v)        {        String inputText = edit.getText().toString();        save(inputText);        finish();        for(int i=0;i<ListAll.data.size();i++)        {        if(ListAll.data.get(i) instanceof Day)        {        }                else if(ListAll.data.get(i)instanceof Point)        {          Point point = (Point)ListAll.data.get(i);       if(point.getDay().equals(da))        {       Day day = new Day(w,da,inputText);       ListAll.data.set(i, day);       save2(ListAll.data);        }        }        }        }        });

当然要在主界面中刷新,这里是设置了点击事件,然后setAdapter(刷新代码略)

小结:

其实save()  和  load()是不需要的,因为list是全局变量,可以免去数据传递,所以我注释掉了,对这两个方法代码感兴趣的朋友可以去上一篇博文看看。

所以总的思路就是:直接利用编辑界面输入的内容构造新的day对象,更新list,在主界面调用一次适配器的处理方法,相当于刷新list即可。


0 0
原创粉丝点击