首页功能管理

首页功能管理_第1张图片

需求原因: 为了方便功能变多后首页展示问题。


刚知道这个需求的时候我就觉得真蛋疼,通告活动要合并,加上原来的正好6个,何必呢,开始是让模仿支付宝首页来做,可以拖动的,网上找了一篇还不错的,
http://blog.csdn.net/xiaanming/article/details/17718579。
后来需求改了,就长按点击图标删除了。

整体布局 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);
}`

实现:
首页功能管理_第2张图片

这是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);  

到这基本就完成了
首页功能管理_第3张图片
首页功能管理_第4张图片

剩下的就是要监听touch事件了。

你可能感兴趣的:(首页功能管理)