整体布局 scrool+viewpager+gridView
<com.yzjy.myview.ScrollViewE
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<com.yzjy.ab.view.AbSlidingPlayView
android:id="@+id/viewPager_menu"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#00000000"
android:paddingBottom="5dp"/>
<com.yzjy.myview.MyGridView
android:id="@+id/my_gridview_home"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2" />
</LinearLayout>
</com.yzjy.myview.ScrollViewE>
因为scroolView嵌套 listView和gridView会出现 只显示一行的问题,所以这里的gridView是做过处理的具体如下
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}`
这是gridView的 Item布局 仅是简单的图片加文字的一个组合。每个item还有一个onItemClick的点击事件,单纯考虑操作的话我们需要自己创建一个对象,里面包含了图片信息,对应的文字。但是这个item现在是不能确定位置的所以,点击事件需要怎么做呢?这时候我们就需要加一个字段也就是对应的id,可以通过id来判断点击后的操作。另外还有一点,怎么确定是在首页还是在更多里面呢,所以我们还需要一个boolean字段,来判断是否是首页图标。
public class Home implements Serializable{
private int id;
private int intentId;
private int drawable;
private String item;
private boolean isHome;
当activity加载时,我们就分别创建对象然后添加到集合里面去
Home h1 = new Home();
h1.setIntentId(1);
h1.setDrawable(R.drawable.menu_guide_1);
h1.setItem("社区通告");
h1.setHome(true);
下面我们就可以对gridview设置长按事件了
gridView_classify.setOnItemLongClickListener
这里有一点要注意,最后return的时候要return true; 不让点击事件向下传递,不然当你执行完后还会执行onItemCLic事件。
这里推荐一篇博文
http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html
这是onItemLongClick的参数,接下来我们要对adapter里面的内容进行操作
public abstract boolean onItemLongClick (AdapterView<?> parent, View view, int position, long id)
当按下视图中的项目并保持按下状态(长按)时执行的回调函数。 实现时如果需要访问与选中条目关联的数据,可以调用 getItemAtPosition(position)。
参数
parent 发生点击事件的 AbsListView。
view AbsListView 中被点击的视图。
position 视图在一览中的位置(索引)。
id 被点击条目的行 ID。
返回值
如果回调函数处理了长按事件,返回真;否则返回假。
目前Adapter的内容
holderView.iv_pic = (ImageView) currentView
.findViewById(R.id.iv_adapter_grid_pic);
holderView.iv_text = (TextView) currentView
.findViewById(R.id.iv_adapter_grid_text);
holderView.iv_jian = (ImageView) currentView
.findViewById(R.id.iv_jian);
首先是长按显示减号图标
ImageView iv_jian = (ImageView) arg1.findViewById(R.id.iv_jian);
iv_jian.setVisibility(View.VISIBLE);
在就是给图标添加动画(其实他是左右晃动的)
TranslateAnimation animation = new TranslateAnimation(0, -5, 0, 0);
animation.setInterpolator(new OvershootInterpolator());
animation.setDuration(100);
animation.setRepeatCount(Integer.MAX_VALUE);
animation.setRepeatMode(Animation.REVERSE);
ImageView iv_adapter_grid_pic (ImageView)arg1.findViewById(R.id.iv_adapter_grid_pic);
iv_adapter_grid_pic.setAnimation(animation);
接着在adapter里面给减号设置一个点击事件来做删除操作
list.get(position).setHome(false);
list.remove(position);
notifyDataSetChanged();
这么做就是一个简单的长按删除图标的操作了,但这是不够的会有许多问题
1、下次再进程序怎么办
2、当一个item进入编辑模式时,再长按另一个图标应外一个也会同时进入编辑状态
3、由于adapter复用的问题,所以当对一个Item进行删除的时候,紧跟着的下一个没长按的item 删除操作图标也会出现。
4、更多里面添加选项后怎么通知首页更新
对于第一点,也就是持久化的操作,我们需要用到数据库
一开始我是想能不能通过写入文件的方式和使用SharedPreferences呢,因为不想写数据库,但发现是 很难实现,网上找的代码都达不到效果。后来只能是使用数据库了,当时想使用 GreenDAO的orm数据库框架,但时间紧迫就改成xutils中的dbutils了,使用方式也非常简单。
用到的 创建 查找 保存 和更新
dbutils会以对象方式存到数据库中 还是很方便的
db = DbUtils.create(mActivity);
allList = (ArrayList<Home>) db.findAll(Home.class);
db.save(h1);
home_f.db.update(list.get(position));
对于编辑状态我们需要在activity中加一个
public static boolean isEdit;
当长按进入编辑状态 改为true 再执行onItemClick和onItemLongClick时候就可以判断是否是否是编辑状态,为true的话就可以做其他操作了
if (isEdit) {
isEdit = false;
adapter_GridView_classify.notifyDataSetChanged();
}
对于第三点 我们需要在adapter的getView()方法中做一个处理,因为每次从集合中删除或添加元素我们都会notifyDataSetChanged();
因此在getView中添加如下
private List<Boolean> isOnLong = new ArrayList<Boolean>();
public Adapter_GridView(Context context, List<Home> list) {
this.context = context;
this.list = list;
for (int i = 0; i < list.size(); i++) {
isOnLong.add(false);
}
public View getView(final int position, View currentView, ViewGroup arg2) {
if (isOnLong.get(position)) {
holderView.iv_jian.setVisibility(View.VISIBLE);
} else {
holderView.iv_jian.setVisibility(View.GONE);
holderView.iv_pic.clearAnimation();//清除动画
}
}
第四点 提示首页 刷新 这里我用到了 广播
Activity中
class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Home h = (Home) intent.getSerializableExtra("HOME");
homeList.add(h);
Collections.sort(homeList, new Comparator<Home>() {
/* * int compare(Student o1, Student o2) 返回一个基本类型的整型, 返回负数表示:o1 * 小于o2, 返回0 表示:o1和o2相等, 返回正数表示:o1大于o2。 */
@Override
public int compare(Home h1, Home h2) {
if (h1.getIntentId() > h2.getIntentId()) {
return 1;
}
if (h1.getIntentId() == h2.getIntentId()) {
return 0;
}
return -1;
}
});
adapter_GridView_classify = new Adapter_GridView(mActivity,
homeList);
gridView_classify.setAdapter(adapter_GridView_classify);
}
}
更多页面adapter中
Intent intent = new Intent();
intent.setAction(Home_F.ACTION_UPDATE_HOME_F);
Bundle bundle = new Bundle();
bundle.putSerializable("HOME", list.get(position));
intent.putExtras(bundle);
context.sendBroadcast(intent);
剩下的就是要监听touch事件了。