两个Listview之间旋转切换,并且为每个item设置动画

这里写图片描述
* 快速点击多个条目的右侧按钮, 动画出现紊乱. 解决方法 : 调低动画的时间
* 快速点击同一条目的右侧按钮, 动画出现紊乱. 解决方法 : 增加标志位
* 添加或删除失败. 解决方法 : 使用界面上的View,为其增加一个新的Tag
*
主布局

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="#00f" >
        <!--这是一个自定义控件,实现切换的-->
        <com.example.mobilesafe.view.SegmentView
            android:id="@+id/activity_application_lock_sv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            app:svLeft="未加锁"
            app:svRight="已加锁"
            app:svSelect="left" >
        </com.example.mobilesafe.view.SegmentView>
    </RelativeLayout>

    <TextView
        android:id="@+id/activity_application_lock_title"
        style="@style/NormalTextStyle"
        android:layout_width="match_parent"
        android:background="#D8BFD8"
        android:padding="3dp"
        android:text="adjvbsd" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ListView
            android:id="@+id/activity_application_lock_locklv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone" >
        </ListView>

        <ListView
            android:id="@+id/activity_application_lock_unlocklv"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </ListView>

        <include
            android:id="@+id/activity_application_lock_loading"
            layout="@layout/loading" />
    </FrameLayout>
public class ActivityApplicationLock extends Activity implements onSegmentSelectedListener {

    private ListView lvLock;
    private ListView lvUnLock;
    private View loading;
    private ArrayList<LockAppbean> lockList = new ArrayList<>();
    private ArrayList<LockAppbean> unLockList = new ArrayList<>();
    private ArrayList<LockAppbean> datas = new ArrayList<>();
    private SegmentView sv;
    private boolean isLeftSelected = true;
    private TextView title;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_application_lock);
        initView();
        initEvent();
        initData();

    }

    private void initEvent() {
        sv.setOnSegmentSelectedListener(this);

    }
    private void initView() {
        lvLock = (ListView) findViewById(R.id.activity_application_lock_locklv);
        lvUnLock = (ListView) findViewById(R.id.activity_application_lock_unlocklv);
        loading = findViewById(R.id.activity_application_lock_loading);
        sv = (SegmentView) findViewById(R.id.activity_application_lock_sv);
        title = (TextView) findViewById(R.id.activity_application_lock_title);
    }

    @Override
    public void onLeftSelected() {
        isLeftSelected = true;

        if (isLeftSelected) {
            title.setText("未加锁(" + unLockList.size() + ")个");
            // lvUnLock.setVisibility(View.VISIBLE);
            // lvLock.setVisibility(View.GONE);
            flipit();
        }

    }

    @Override
    public void onRightSeleted() {
        isLeftSelected = false;
        if (!isLeftSelected) {
            title.setText("已加锁(" + lockList.size() + ")个");
            // lvUnLock.setVisibility(View.GONE);
            // lvLock.setVisibility(View.VISIBLE);
            flipit();
        }

    }

    private Interpolator accelerator = new AccelerateInterpolator();
    private Interpolator decelerator = new DecelerateInterpolator();
    /**
     * 实现两个ListView之间旋转切换的方法
     * DESC :  . <br/>
     */
    private void flipit() {
        final ListView visibleList;
        final ListView invisibleList;
        if (lvUnLock.getVisibility() == View.GONE) {
            visibleList = lvLock;
            invisibleList = lvUnLock;
        } else {
            invisibleList = lvLock;
            visibleList = lvUnLock;
        }
        ObjectAnimator visToInvis = ObjectAnimator.ofFloat(visibleList, "rotationY", 0f, 90f);
        visToInvis.setDuration(300);
        visToInvis.setInterpolator(accelerator);
        final ObjectAnimator invisToVis =
                ObjectAnimator.ofFloat(invisibleList, "rotationY", -90f, 0f);
        invisToVis.setDuration(300);
        invisToVis.setInterpolator(decelerator);
        visToInvis.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator anim) {
                visibleList.setVisibility(View.GONE);
                invisToVis.start();
                invisibleList.setVisibility(View.VISIBLE);
            }
        });
        visToInvis.start();
    }

    private void initData() {
        new Task().execute();
    }

    class Task extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            loading.setVisibility(View.VISIBLE);
            title.setVisibility(View.GONE);
        }

        @Override
        protected Void doInBackground(Void... params) {
            SystemClock.sleep(1000);
            PackageManager pm = getPackageManager();
            List<ApplicationInfo> installedApplications = pm.getInstalledApplications(0);
            for (ApplicationInfo info : installedApplications) {
                LockAppbean appbean = new LockAppbean();
                appbean.icon = pm.getApplicationIcon(info);
                String packageName = info.packageName;
                appbean.pkgName = packageName;
                Intent intent = pm.getLaunchIntentForPackage(packageName);
                if (intent == null) {
                    continue;
                }
                try {
                    ApplicationInfo applicationInfo = pm.getApplicationInfo(packageName, 0);
                    appbean.name = pm.getApplicationLabel(applicationInfo).toString();

                } catch (NameNotFoundException e) {
                    appbean.name = packageName;
                    e.printStackTrace();
                }
                datas.add(appbean);

            }
            for (LockAppbean bean : datas) {
                if (AppLockDAO.isLock(ActivityApplicationLock.this, bean.pkgName)) {
                    lockList.add(bean);
                } else {
                    unLockList.add(bean);
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            loading.setVisibility(View.GONE);
            title.setVisibility(View.VISIBLE);
            if (isLeftSelected) {
                title.setText("未加锁(" + unLockList.size() + ")个");

            } else {
                title.setText("已加锁(" + lockList.size() + ")个");
            }

            lockAdapter adapter = new lockAdapter();
            lvUnLock.setAdapter(adapter);
            // lockAdapter adapterUnlock = new lockAdapter();
            lvLock.setAdapter(adapter);

        }

    }


    /**
     * 这是ListView的adapter
     * @author Administrator 
     * @version ActivityApplicationLock
     */
    class lockAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            if (isLeftSelected) {
                return unLockList == null ? 0 : unLockList.size();
            } else {
                return lockList == null ? 0 : lockList.size();
            }

        }

        @Override
        public LockAppbean getItem(int position) {
            if (isLeftSelected) {
                if (unLockList != null) {
                    return unLockList.get(position);
                } else {
                    return null;
                }
            } else {
                if (lockList != null) {
                    return lockList.get(position);
                } else {
                    return null;
                }
            }
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                convertView =
                        View.inflate(ActivityApplicationLock.this, R.layout.app_lock_item, null);
                holder = new ViewHolder();
                holder.icon = (ImageView) convertView.findViewById(R.id.app_lock_item_iv_icon);
                holder.name = (TextView) convertView.findViewById(R.id.app_lock_item_tv_name);
                holder.isLock = (ImageView) convertView.findViewById(R.id.app_lock_item_iv_islock);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            LockAppbean appbean = getItem(position);
            holder.icon.setImageDrawable(appbean.icon);
            holder.name.setText(appbean.name);
            if (isLeftSelected) {
                holder.isLock.setImageResource(R.drawable.unlock_app_item_selector);
            } else {
                holder.isLock.setImageResource(R.drawable.lock_app_item_selector);
            }
            final View animView = convertView;
            Tag tag = (Tag) holder.isLock.getTag();
            if (tag == null) {
                tag = new Tag();
                tag.appbean = appbean;
                tag.isAnimotion = false;
                holder.isLock.setTag(tag);
            } else {
                tag.appbean = appbean;
            }
            holder.isLock.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    final Tag tag = (Tag) holder.isLock.getTag();
                    if (tag.isAnimotion) {
                        return;
                    }
                    if (isLeftSelected) {
                        // 添加动画
                        TranslateAnimation animation =
                                new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, //
                                        Animation.RELATIVE_TO_PARENT, 1f, //
                                        Animation.RELATIVE_TO_PARENT, 0, //
                                        Animation.RELATIVE_TO_PARENT, 0);//
                        animation.setDuration(400);
                        ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 0f, 1f, 0.2f);
                        scaleAnimation.setDuration(400);
                        AnimationSet set = new AnimationSet(false);
                        set.addAnimation(scaleAnimation);
                        set.addAnimation(animation);
                        set.setAnimationListener(new AnimationListener() {

                            @Override
                            public void onAnimationStart(Animation animation) {}

                            @Override
                            public void onAnimationRepeat(Animation animation) {}

                            @Override
                            public void onAnimationEnd(Animation animation) {
                                // 像数据库中插入一条数据
                                // unlock集合减少一条数据
                                // title减一
                                // lovk集合增加一条数据
                                // 更新界面
                                tag.isAnimotion = false;
                                boolean insert = AppLockDAO.insert(ActivityApplicationLock.this,
                                        tag.appbean.pkgName);
                                if (insert) {
                                    unLockList.remove(tag.appbean);
                                    lockList.add(tag.appbean);
                                    title.setText("已加锁(" + unLockList.size() + ")个");
                                    notifyDataSetChanged();
                                } else {
                                    ToastUtils.showToast(ActivityApplicationLock.this, "加锁失败");
                                }

                            }
                        });
                        animView.startAnimation(set);

                    } else {
                        TranslateAnimation animation =
                                new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0f, //
                                        Animation.RELATIVE_TO_PARENT, -1f, //
                                        Animation.RELATIVE_TO_PARENT, 0, //
                                        Animation.RELATIVE_TO_PARENT, 0);//
                        animation.setDuration(500);
                        ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 0f, 1f, 0.2f);
                        scaleAnimation.setDuration(400);
                        // ScaleAnimation scaleAnimation =new
                        AnimationSet set = new AnimationSet(false);
                        set.addAnimation(animation);
                        set.addAnimation(scaleAnimation);
                        set.setAnimationListener(new AnimationListener() {

                            @Override
                            public void onAnimationStart(Animation animation) {}

                            @Override
                            public void onAnimationRepeat(Animation animation) {}

                            @Override
                            public void onAnimationEnd(Animation animation) {
                                tag.isAnimotion = false;
                                boolean insert = AppLockDAO.delete(ActivityApplicationLock.this,
                                        tag.appbean.pkgName);
                                if (insert) {
                                    unLockList.add(tag.appbean);
                                    lockList.remove(tag.appbean);
                                    title.setText("已加锁(" + lockList.size() + ")个");
                                    notifyDataSetChanged();
                                } else {
                                    ToastUtils.showToast(ActivityApplicationLock.this, "解锁失败");
                                }
                            }
                        });
                        animView.startAnimation(set);
                    }

                }
            });
            return convertView;
        }

         class ViewHolder {
            ImageView icon;
            TextView name;
            ImageView isLock;
        }

        class Tag {
            LockAppbean appbean;
            boolean isAnimotion;
        }

    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用 ListView 显示数据时,每个 item 的宽度默认是和 ListView 的宽度一致的,如果想要设置每个 item 的宽度,可以通过设置自定义 item 布局的方式实现。 1. 创建自定义的 item 布局文件,例如 `item_layout.xml`,在该布局中设置 item 的宽度,可以使用 `android:layout_width` 属性来设置宽度,例如: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="16dp"> <TextView android:id="@+id/item_text" android:layout_width="100dp" android:layout_height="wrap_content" android:text="Item Text"/> </LinearLayout> ``` 上面的代码中,`TextView` 的宽度设置为 `100dp`,可以根据需求设置不同的宽度。 2. 在适配器中加载自定义的 item 布局文件,例如: ```java public class MyAdapter extends ArrayAdapter<String> { public MyAdapter(Context context, List<String> data) { super(context, R.layout.item_layout, data); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { LayoutInflater inflater = LayoutInflater.from(getContext()); view = inflater.inflate(R.layout.item_layout, parent, false); } TextView textView = view.findViewById(R.id.item_text); textView.setText(getItem(position)); return view; } } ``` 上面的代码中,`MyAdapter` 继承自 `ArrayAdapter`,在 `getView()` 方法中加载自定义的 item 布局文件 `item_layout.xml`,并设置 `TextView` 的文本内容。 通过上述方式,可以设置每个 item 的宽度为自定义值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值