# 使用GridView实现txt阅读器的书架模块

使用GridView实现txt阅读器的书架模块

本文属于博主个人原创,转载请注明出处,请尊重他人劳动成果,谢谢。
最近公司的项目是一个txt阅读器,因为是小公司,所以这个项目就是我一个人在写,也可以说是心力交瘁了。
刚开始我也在网上查了好多,用ListView做出来的效果也确实是不错的,可以定义每层的背景,有好多模仿iReader布局的。

这张就是书架的主界面了
这张是某本书长按之后的效果,每个子条目的CheckBox显示出来,用于勾选书籍
接下来看代码吧。。
这里写代码片`

class ShelfAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return books.size() + 1;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            LayoutInflater inflater;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = LayoutInflater.from(BookshelfActivity.this)
                        .inflate(R.layout.item_grid_bookshelf, null);
                        //显示书的封面的ImageView
                holder.img = (ImageView) convertView.findViewById(R.id.img);
                //显示书名的TextView
                holder.txt = (TextView) convertView.findViewById(R.id.txt);
                //用来勾选的CheckBox
                holder.ch = (CheckBox) convertView
                        .findViewById(R.id.chb_select);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            if (position == books.size()) {
            //这里需要判断,如果是最后一个数据,那么给设置图片为添加书籍的图片
                holder.img.setImageResource(R.drawable.cover_net);
            } else {
            //这里判断,如果该书的选中的,那么就设置CheckBox为选中,因为CheckBox是公用的,你需要把Checkbox和每本书联系起来才能达到,选中书就勾选,勾选就选中书。换个说法就是必须绑定在一起吧。
                if (books.get(position).isSelect()) {
                    holder.ch.setChecked(true);
                } else {
                    holder.ch.setChecked(false);
                }
                holder.img.setImageResource(R.drawable.book1);
                holder.txt.setText(books.get(position).getBookName());
            }
            Log.e(this + "", "位置=" + position);
            if (!holder.txt.getText().equals("")) {
            }
            return convertView;
        }

        public void refush() {
        //这个方法是用来刷新界面的。我们需要在GridView的子条目的点击事件中用到。
            notifyDataSetInvalidated();
        }

        class ViewHolder {
            ImageView img;
            TextView txt;
            CheckBox ch;

        }

这块是适配器里的getView方法。

shelfAdapter = new ShelfAdapter();
//设置 适配器
        mGrdShelf.setAdapter(shelfAdapter);
        //子条目的点击事件,就是点击每本书的事件
        mGrdShelf.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View view,
                    int position, long arg3) {
                    //这里需要判断是否是勾选模式
                if (!isSelectMode) {
                    //这里是勾选模式了,需要判断角标不超过最后一个,因为最后一个是添加书用的,勾选的时候最后一个是隐藏的
                    if (position < books.size()) {
                        if (!books.get(position).isSelect()) {
                        //设置点击的书为选中状态
                            books.get(position).setSelect(true);
                            //并且将书添加到存放选中书的集合中,以备后面删除的时候用。
                            mSelectBooks.add(books.get(position));
                        } else {
                        //设置点击的书为未选中状态
                            books.get(position).setSelect(false);
                            //并且将书从集合中移除
                            mSelectBooks.remove(books.get(position));
                        }
                        //给底下的按钮设置文字,即是在计数
                        mBtnSelcount.setText(mSelectBooks.size() + "");
                    }
                    //刷新适配器,当你每次点击之后,书的选中状态切换了,但是界面并没有更新,所以需要刷新界面。刷新的时候就会重新调用getView方法,从而会根据书的选中状态来画出checkBox的状态。
                    shelfAdapter.refush();
                } else {
                    if (position == books.size()) {
                        return;
                    } else {
                        if (position < books.size() + 1) {
                            //这里是非勾选状态,点击之后,会跳到看书的界面.
                            Intent read = new Intent(BookshelfActivity.this,
                                    ReadActivity.class);
                            read.putExtra("_id", books.get(position)
                                    .getBookid());
                            startActivity(read);
                        }
                    }

                }
            }
        });
        //这里是子条目的长按事件。
        mGrdShelf.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View view,
                    int position, long arg3) {
                if (isSelectMode) {
                    /**
                     * 如果是最后的添加书籍的直接return
                     */
                    if (position == books.size()) {
                        return true;
                    }
                    /**
                     * 显示自定义的menu
                     */
                    pop.showAtLocation(findViewById(R.id.bookshelf),
                            Gravity.BOTTOM, 0, 0);
                    /**
                     * 选择模式,初始化存放选择了的书的集合
                     */
                    mSelectBooks = new ArrayList<BookInfo>();
                    /**
                     * 遍历,使每个子view中的checkbox显示出来
                     */
                    for (int i = 0; i < mGrdShelf.getChildCount(); i++) {
                        View item = mGrdShelf.getChildAt(i);
                        CheckBox imgSelect = (CheckBox) item
                                .findViewById(R.id.chb_select);
                        imgSelect.setVisibility(View.VISIBLE);
                        if (i == books.size()) {
                            item.setVisibility(View.INVISIBLE);
                            continue;
                        }
                        books.get(i).setSelect(false);
                    }
//                  
                    /**
                     * 将当前长按的书标记为选中
                     */
                    books.get(position).setSelect(true);
                    /**
                     * 将该书存放到集合中
                     */
                    mSelectBooks.add(books.get(position));
                    /**
                     * 给下方menu中的按钮计数
                     */
                    mBtnSelcount.setText(mSelectBooks.size() + "");
                    /**
                     * 设置下次进来是为非选择模式
                     */
                    isSelectMode = false;
                } else {
                    pop.dismiss();
                    mSelectBooks.clear();
                    if (position == books.size()) {
                        return true;
                    }
                    for (int i = 0; i < mGrdShelf.getChildCount(); i++) {

                        View item = mGrdShelf.getChildAt(i);
                        CheckBox imgSelect = (CheckBox) item
                                .findViewById(R.id.chb_select);

                        imgSelect.setVisibility(View.INVISIBLE);
                        if (i == books.size()) {
                            item.setVisibility(View.VISIBLE);
                            continue;
                        }
                        books.get(i).setSelect(false);
                    }
                    isSelectMode = true;
                }

                shelfAdapter.refush();
                //注意:需要设置为返回true,不然当你长按完成之后,也会出发点击事件。
                return true;
            }
        });
    }

本人才疏学浅,写这个只为了发扬开源的精神,毕竟每次我在网上找不到的时候真的很蛋疼。放出来大家共同学习。
大家可以加qq群:137149792 ,共同讨论,共同学习.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值