ListView下拉刷新(1):
自定义ListView 添加一个HeaderView
\
(0)初始时设置headerView 的topPadding = -headerHead,将headerView隐藏;
在向下拉的过程(MOVE)
(1)提示下拉可以刷新, (-headerHead, headerHead+50]
手指保持在屏幕上, 向上移动,变为(0)隐藏\
(2)松开可以刷新 ( headerHead+50, headerHead+150]
手指保持在屏幕上, 向上移动,变为(1)
(DOWN)
在(1)的状态下, 松开手指,变为(0)
在(2)的状态下,松开手指, 变为刷新,
\
在设置headerView 的位置之前, 首先测量HeaderView 并通知父容器为
其分配控件
(1)获取参数布局,
ViewGroup.LayoutParams lp = view.getLayoutParams();
如果lp为空(headerView还未添加到父容器中, 或者。。。), 创建布局
lp = new LayoutParams(ViewGroup.LayoutParams.match_parent, ViewGroup.LayoutParams.warp_content);
(3)根据布局设置view的高度和宽度
int width = ViewGroup.getChildMeasureSpec(0, 0, lp.width);//由于上面布局 的宽度设置为match_parent
int height = ;//高度是wrap_content;
获取建议的高度 int tempHeight = lp.height;
更具header的height的设置
if(temp < 0){
height = MeasureSpec.makeMeasure(tmpHeight, EXACTLY)
} else {
height = MeasureSpec.makeMeasure(tmpHeight, UNSPECIFIED)
}
(4)最重要一步,根据测量的值,设置view, 通知父容器
view.measure(width, height);
\
\
/**
* 测量顶部布局,并通知容器,设置顶部布局的高度和宽度
*/
private void measureView(View view) {
//获取布局参数
ViewGroup.LayoutParams lp = view.getLayoutParams();
if(lp == null){
lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
int width = ViewGroup.getChildMeasureSpec(0, 0, lp.width);
int height = 0;
int tempHeight = lp.height;
if(tempHeight < 0){
height = MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.EXACTLY);
} else {
height = MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.UNSPECIFIED);
}
view.measure(width, height);
}
设置HeadeView的顶部padding
/**
* 设置顶部布局的顶部padding
* @param topPadding
*/
public void topPadding(int topPadding) {
header.setPadding(header.getPaddingLeft(), topPadding,
header.getPaddingRight(), header.getPaddingBottom());
header.invalidate();
}
\
\
\
\
\
\
\
\
\
\
\
\
\
自定义ListView:
package com.imooc.listviewfrashdemo1;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Window;
import android.widget.ArrayAdapter;
import com.example.listviewfrashdemo1.R;
import com.imooc.listviewfrashdemo1.MyFlashListView.ILoadListener;
public class MyFlushActivity extends Activity implements ILoadListener{
MyFlashListView mlv;
ArrayAdapter<String> adapter;
List<String> datas = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.my_acitivity_main);
initData();
initView();
}
/**
* 初始化
*/
public void initView() {
mlv = (MyFlashListView) findViewById(R.id.mlv);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas);
mlv.setAdapter(adapter);
}
public void initData(){
for (int i = 0; i < 20; i++) {
datas.add("更新项目"+datas.size());
}
}
@Override
public void onLoad() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mlv.doComplete();
}
}, 1000);
initData();
}
}
MyFlushActivity.java
package com.imooc.listviewfrashdemo1;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Window;
import android.widget.ArrayAdapter;
import com.example.listviewfrashdemo1.R;
import com.imooc.listviewfrashdemo1.MyFlashListView.ILoadListener;
public class MyFlushActivity extends Activity implements ILoadListener{
MyFlashListView mlv;
ArrayAdapter<String> adapter;
List<String> datas = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.my_acitivity_main);
initData();
initView();
}
/**
* 初始化
*/
public void initView() {
mlv = (MyFlashListView) findViewById(R.id.mlv);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas);
mlv.setAdapter(adapter);
}
public void initData(){
for (int i = 0; i < 20; i++) {
datas.add("更新项目"+datas.size());
}
}
@Override
public void onLoad() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mlv.doComplete();
}
}, 1000);
initData();
}
}
\
\
\
\
\
\
\
\
\