Days30 PullToRefreshListView & SlidingMenu

(一)PullToRefreshListView下拉刷新的ListView
需要注意的地方:
1、PullToRefreshListView和ListView不同(面试)
PullToRefreshListView继承LinearLayOut
ListView继承ViewGroup
2、下拉刷新的那个标识算ListView的一个条目
如果给ListView添加头部,头部也算ListView的一个条目
3、设置下拉刷新setOnRefreshListener
设置最后一个条目可见监听setOnLastItemVisibleListener
4、该布局产生的对象ptrListView本身并不是 ListView,而是程序内部动态生成了一个 ListView 实例
5、onRefreshComplete(); 方法,表示当前事件已完全结束,不算动态更新UI
代码如下:

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    private PullToRefreshListView ptrListView = null;

    private List<String> list = null;
    private ArrayAdapter<String> adapter = null;

    private Handler handler = new Handler();

    private List<ImageView> list2 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        setData();

        setListener();
    }

    private void setListener() {
//        设置ListView的条目点击监听
        ptrListView.setOnItemClickListener(this);

//        设置最后一个条目可见监听
        ptrListView.setOnLastItemVisibleListener(new PullToRefreshBase.OnLastItemVisibleListener() {
            @Override
            public void onLastItemVisible() {
                Toast.makeText(MainActivity.this, "上拉加载", Toast.LENGTH_SHORT).show();
//                开启一个线程模拟下载数据(耗时操作放在子线程中)
                new Thread(){
                    @Override
                    public void run() {
                        super.run();
                        SystemClock.sleep(3000);

//                        list.clear();
                        for (int i = 0;i<30;i++){
                            list.add("i am adddata"+i);
                        }

                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                adapter.notifyDataSetChanged();
                                ptrListView.onRefreshComplete();
                            }
                        });
                    }
                }.start();
            }
        });

//        设置下拉刷新
        ptrListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
            @Override
            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                Toast.makeText(MainActivity.this, "下拉刷新", Toast.LENGTH_SHORT).show();

                new Thread(){
                    @Override
                    public void run() {
                        super.run();
                        SystemClock.sleep(3000);

                        list.clear();
                        for (int i = 0;i<20;i++){
                            list.add("i am 下拉 data"+i);
                        }

                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                adapter.notifyDataSetChanged();
//                                onRefreshComplete(); 方法,表示当前事件已完全结束
                                ptrListView.onRefreshComplete();;
                            }
                        });
                    }
                }.start();
            }
        });
    }

    private void setData() {
        list = new ArrayList<>();
        for (int i = 0;i<50;i++){
            list.add("i am raw data"+i);
        }

        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,list);

//        该布局产生的对象ptrListView本身并不是 ListView,而是程序内部动态生成了一个 ListView 实例,
//        若要获取真正的 ListView 对象则需要使用getRefreshableView()方法来获取
        ListView listView = ptrListView.getRefreshableView();

        View v = LayoutInflater.from(this).inflate(R.layout.ptflv_header,null);

        ViewPager vpShow = (ViewPager) v.findViewById(R.id.vpShow);

        list2 = new ArrayList<ImageView>();
        int[] arr = new int[]{R.drawable.a,R.drawable.b,R.drawable.c};
        ImageView iv = null;
        for (int i = 0;i<arr.length;i++){
            iv = new ImageView(this);
            iv.setImageResource(arr[i]);
            list2.add(iv);
        }

        vpShow.setAdapter(new PagerAdapter() {
            @Override
            public int getCount() {
                return list2.size();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                container.addView(list2.get(position));
                return list2.get(position);
            }

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView(list2.get(position));
            }
        });

//        给listView添加头部
        listView.addHeaderView(v);

        ptrListView.setAdapter(adapter);
    }

    private void initView() {
        ptrListView = (PullToRefreshListView) findViewById(R.id.ptrListView);
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//        因为条目的布局id  android.R.layout.simple_dropdown_item_1line多对应的布局中只有TextView,
//        所以条目可转为TextView
        Toast.makeText(this,((TextView)view).getText().toString(),Toast.LENGTH_LONG).show();
    }
}

(二)SlidingMenu抽屉
参考自:
http://blog.youkuaiyun.com/jdsjlzx/article/details/42387903
http://blog.youkuaiyun.com/lmj623565791/article/details/36677279
自定义控件绘图:http://blog.youkuaiyun.com/harvic880925/article/details/39080931

1、在Activity中通过SlidingMenu构造方法,直接设置侧滑菜单
步骤:
1、将SlidingMenuLibrary作为library导入工程中
工程Properties–》Android–》下面的add
2、创建SlidingMenu对象

smMenu = new SlidingMenu(this);

3、设置菜单的显示模式

smMenu.setMode(SlidingMenu.LEFT);

1)SlidingMenu.LEFT 左测菜单
2)SlidingMenu.RIGHT 右侧菜单
3)SlidingMenu.LEFT_RIGHT 左右2测菜单
注意:如果是1)或者 2)的话,menu界面只用setMenu()就可以设定了
如果是3)的话,必须在加上setSecondaryMenu()这个方法
4、设置菜单的资源视图,可以是自定义布局ResId,也可以是View

smMenu.setMenu(R.layout.left);

5、菜单的触摸方式

smMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
SlidingMenu.TOUCHMODE_FULLSCREEN全屏幕模式,全屏滑动都可打开
SlidingMenu.TOUCHMODE_MARGIN侧边模式,只在屏幕侧边滑动才能打开,中心滑动不能打开
SlidingMenu.TOUCHMODE_NONE禁止触摸模式,不能够通过触摸打开,只能够通过SlidingMenu().toggle()打开或者是关闭

6、SlidingMenu划出时主页面显示的剩余宽度

smMenu.setBehindOffset(400);

7、设置菜单的宽度(与6相反,选择设置一个即可)

smMenu.setBehindWidth(400);

8、将菜单附加到当前的Activity窗口中

smMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);

SlidingMenu.SLIDING_CONTENT在内容除显示菜单 菜单栏里包括ActionBar或标题(menu作为内容展示)
SlidingMenu.SLIDING_WINDOW在窗体显示菜单 菜单栏里不包括ActionBar或标题
9、给菜单中的每个按钮设置监听,改变当前Activity中的内容

        smMenu.getMenu().findViewById(R.id.btnNews).setOnClickListener(this);
        smMenu.getMenu().findViewById(R.id.btnTech).setOnClickListener(this);

10、动态判断自动关闭或开启菜单

smMenu.toggle();

11、设置SlidingMenu与下方视图的移动的速度比,当为1时同时移动,取值0-1

smMenu.setBehindScrollScale(0);

12、获取菜单的显示状态

smMenu.isMenuShowing();

13、显示菜单

smMenu.showMenu();

2、通过Activity继承SlidingFragmentActivity
备注:
1、onCreate方法的限定词 protected改为public
2、可以直接通过getSlidingMenu()方法获取到SlidingMenu对象
activity:
3、重点是:将侧滑栏的Fragment对象填充到侧滑栏的容器的布局文件中
给菜单设置画布转换的动画

public class MainActivity extends SlidingFragmentActivity implements Callback {
    private TextView txtTitle, txtInfo;
    private ImageButton ibTitle, ibInfo;

    private SlidingMenu smMenu = null;

    // protected改为public
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 给当前的窗口设置背景图片
        getWindow().setBackgroundDrawableResource(R.drawable.top);

        // 设置存放侧滑栏的容器的布局文件 参数可以是View也可以是布局资源Id
        setBehindContentView(R.layout.ft_menu);

        initView();

        // 获取到SlidingMenu对象
        smMenu = getSlidingMenu();

        smMenu.setMode(SlidingMenu.RIGHT);

        // 设置actionBar能否跟随侧滑栏移动,如果没有,则可以去掉
        setSlidingActionBarEnabled(true);

        smMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
        smMenu.setBehindOffset(200);

//      将侧滑栏的Fragment对象填充到侧滑栏的容器的布局文件中
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.menuLayoutId, new MyFragment()).commit();

        // 给菜单设置画布转换的动画     CanvasTransformer对象
        smMenu.setAboveCanvasTransformer(new CanvasTransformer() {

            // 设置当前画布转换的监听
            /**
             * percentOpen  滑动菜单栏打开时的百分比值
             */
            @Override
            public void transformCanvas(Canvas canvas, float percentOpen) {
                Log.d("test",percentOpen+"-------------percentOpen");
                float scale = (float) (1 - 0.25 * percentOpen);
                Log.d("test", scale+"==============scale");

                // 画布的缩放
//              后两个参数确定画布上的坐标,以该坐标为轴心点
//              前两个参数为x方向y方向缩放后的比例
//              即以轴心点坐标,将x长度,y长度缩放至对应前两个参数的值
                canvas.scale(scale, scale, canvas.getWidth() / 10000,
                        canvas.getHeight() / 10000);

                ibTitle.setAlpha(1 - percentOpen);
                ibTitle.setRotation((1 - percentOpen) * 360);
            }
        });
    }

    public void click(View v) {
        switch (v.getId()) {
        case R.id.ibTitle:
            smMenu.toggle();
            break;

        default:
            break;
        }
    }

    @Override
    public void onItemClick(String title) {
        txtInfo.setText("正在加载" + title + "中的信息");
        txtTitle.setText(title);

        // 菜单条目被点击,让菜单关闭
        smMenu.toggle();
    }

    private void initView() {
        txtTitle = (TextView) findViewById(R.id.txtTitle);
        txtInfo = (TextView) findViewById(R.id.txtInfo);
        ibTitle = (ImageButton) findViewById(R.id.ibTitle);
        ibInfo = (ImageButton) findViewById(R.id.ibInfo);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值