使用GridView实现txt阅读器的书架模块
本文属于博主个人原创,转载请注明出处,请尊重他人劳动成果,谢谢。
最近公司的项目是一个txt阅读器,因为是小公司,所以这个项目就是我一个人在写,也可以说是心力交瘁了。
刚开始我也在网上查了好多,用ListView做出来的效果也确实是不错的,可以定义每层的背景,有好多模仿iReader布局的。
接下来看代码吧。。
这里写代码片`
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 ,共同讨论,共同学习.