黑马程序员技术交流社区

标题: 我也问一个九期中未被解决的问题,求解决! android Gallery分页问题 [打印本页]

作者: 符云爵    时间: 2012-5-3 12:08
标题: 我也问一个九期中未被解决的问题,求解决! android Gallery分页问题
    private final Handler handler = new Handler(Looper.getMainLooper()) {

        @Override
        public void handleMessage(Message msg) {
            int state = msg.getData().getInt("state");
            switch (state) {
            case FINISH:
                ArrayList<ImageList> templist = msg.getData()
                        .getParcelableArrayList("list");
                if (templist.size() < load_count) {
                    loadMore = false;
                }
                if (adapter == null) {
                    adapter = new Gallery_Adapter(context, 0, templist);
                    // set adapter
                    gallery.setAdapter(adapter);
                } else {
                    adapter.notifyDataSetChanged();//调用这个函数后getview()的position没有变为0
                }
                break;
            }
            super.handleMessage(msg);
        }

    };



用ArrayAdapter实现Gallery翻页,每次查询完成后跳到该Handler,对ArrayAdapter中的数据进行更改,但是得不到效果,谁能说下这过程吗? 调用notifyDataSetChanged()这个方法后,是不是不用再另外进行数据改变的通知?或者说该不adapter为null了,调用notifyDataSetChanged()后会自动通知数据更改为新的templist,因为每次回到Handler都会得到新的templist?
作者: 符云爵    时间: 2012-5-8 18:37
自己顶,  今天再来纠结这个问题,查了不少资料,总算解决了。 此外,鄙视百度,搜出来的东西,牛头不对马嘴,靠你哥就悲剧了,   顶Google。

更正一下上面我的疑问,每次进入Handler获取新的templist,并调用notifyDataSetChanged()通知arrayadapter数据已更改,在getView()方法中position变为0,意为每次查询后把adapter中的集合更改为templist, 这是上面代码的思路,是错的。比如:我每次查询10条数据,Gallery得到十张图片,当它被拖拉到第十张时,即position为9,此时下一张图片的位置position为0的话前面的图片位置不就成负数了。。真是愚蠢的思路,看经理的代码误导的= =   我去,没看明白,太蠢了。下面代码是正解:

        private ArrayList<Image> G_imagelist;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.image_gallery);
                this.context = this;
                G_imagelist = new ArrayList<Image>();
                // bindData
                new bindData().execute();
        }
private final Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            int state = msg.getData().getInt("state");
            switch (state) {
            case FINISH:
                ArrayList<ImageList> templist = msg.getData()
                        .getParcelableArrayList("list");
                for(Image image : templist) {
                        G_imagelist.add(image);
                }
                if (adapter == null) {
                    adapter = new Gallery_Adapter(context, 0, G_imagelist);
                    // set adapter
                    gallery.setAdapter(adapter);
                } else {
                    adapter.notifyDataSetChanged();//
                }
                break;
            }
            super.handleMessage(msg);
        }
    };
根据http://stackoverflow.com/questions/3669325/notifydatasetchanged-example/5092426#5092426中的回答得到了解决方法,通过一个成员集合的活动去告诉ArrayAdapter数据的更改,而不是局部的集合,即templist,应该使用全局的集合G_imagelist。   问题得到解决,到翻页时position不会因此重置为0,而是继续叠加,即第十一张的positon值为10,以此类推。

当然,楼顶的代码也不是不可行的,可以使用局部的集合来进行通知adapter,解决方法如下:
    private final Handler handler = new Handler(Looper.getMainLooper()) {

        @Override
        public void handleMessage(Message msg) {
            int state = msg.getData().getInt("state");
            switch (state) {
            case FINISH:
                ArrayList<ImageList> templist = msg.getData()
                        .getParcelableArrayList("list");
                if (templist.size() < load_count) {
                    loadMore = false;
                }
                if (adapter == null) {
                    adapter = new Gallery_Adapter(context, 0, templist);
                    // set adapter
                    gallery.setAdapter(adapter);
                } else {
                        //一条条往adapter的集合中添加翻页查询后的数据
                        for (Image image : templist) {
                                adapter.add(image);
                        }
                    adapter.notifyDataSetChanged();//
                }
                break;
            }
            super.handleMessage(msg);
        }
    };
Gallery使用此种方法不知有没什么瑕疵。   Google里搜出很多ListView使用这种方法改变数据后在一些事件中得不到后面更新列表的数据,没研究过不清楚。

Your choices are:
    Use the functions of the ArrayAdapter to modify the underlying List (add, insert, remove, clear, etc.)
    Re-create the ArrayAdapter with the new List data.
    Create your own class derived from BaseAdapter and ListAdapter that allows changing of the underlying List data structure.
Then notifyDataSetChanged will work.
根据这里的说法应该还有其它方法可以实现翻页的功能,不过暂不深究咯,完成功能交差先= =   拖了好多天。



解决方法更大家分享下,或许以后用得上。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2