(一)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);
}
}