封装GridView实现类似ListView添加页脚,分页加载数据进度提示

1、封装的GridView:
public class PageGridView extends LinearLayout {

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
private GridView gridview;
private LinearLayout footerView;

public static final String TAG = "ListViewWithPage";

public PageGridView(Context context) {
    super(context);
    init();
}

public PageGridView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

public PageGridView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init(){        
    gridview = new GridView(getContext());
    setOrientation(LinearLayout.VERTICAL);
    addView(gridview);  

    gridview.getLayoutParams().width = LinearLayout.LayoutParams.FILL_PARENT;
    gridview.getLayoutParams().height = LinearLayout.LayoutParams.WRAP_CONTENT;

    //设置footer,可以在里面加进度条等内容
    footerView = new LinearLayout(getContext());

    ProgressBar pb = new ProgressBar(getContext());
    TextView tvMessage = new TextView(getContext());
    tvMessage.setText("正在加载数据。。。");
    tvMessage.setTextSize(20);

    footerView.addView(pb);
    footerView.addView(tvMessage);
    footerView.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.TOP);

    addView(footerView);

    footerView.getLayoutParams().width = LinearLayout.LayoutParams.FILL_PARENT;
    footerView.getLayoutParams().height = 100;        
    footerView.setVisibility(View.GONE);
}

//由于调用此方法一般都为单开线程,不能直接更新控件状态,因此需要一个Handler来协助
public void updateFooter(int statue){
    updateFooterViewHandler.sendEmptyMessage(statue);
}

private Handler updateFooterViewHandler = new Handler(){
    @Override
    public void handleMessage(android.os.Message msg) {
        //这里状态 可以控制为多个,如果想要下拉箭头的话,可以根据状态来修改控件内容,这里我只设置是否显示而已
        footerView.setVisibility(msg.what);
        //当设置View.GONE的时候,数据已经加载完成,因此需要通知数据改变
        if(msg.what==View.GONE){
            ((BaseAdapter)gridview.getAdapter()).notifyDataSetChanged();
        }
    };
};

public void setOnScrollListener(OnScrollListener onScrollListener){
    gridview.setOnScrollListener(onScrollListener);
}

public void setNumColumns(int number){
    gridview.setNumColumns(number);
}

public void setVerticalSpacing(int spacing){
    gridview.setVerticalSpacing(spacing);
}

public void setHorizontalSpacing(int spacing){
    gridview.setHorizontalSpacing(spacing);
}

public void setColumnWidth(int width){
    gridview.setColumnWidth(width);
}

public void setStretchMode(int stretchMode){
    gridview.setStretchMode(stretchMode);
}

public void setAdapter(BaseAdapter adapter){
    gridview.setAdapter(adapter);        
}

public void setOnItemClickListener(OnItemClickListener itemClickListener){
    gridview.setOnItemClickListener(itemClickListener);
}

}

2、调用:
public class MainActivity extends Activity {

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
private List<String> datas = new ArrayList<String>();

private PageGridView gridview;

private BaseAdapter adapter = new BaseAdapter() {           
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        LinearLayout llParent = new LinearLayout(MainActivity.this);
        TextView tv = new TextView(MainActivity.this);
        llParent.addView(tv);
        tv.setText("第"+position+"个");
        tv.getLayoutParams().width=200;
        tv.getLayoutParams().height = 30;
        tv.setGravity(Gravity.CENTER);
        llParent.setBackgroundColor(Color.GRAY);
        int padding = 10;
        llParent.setPadding(padding, padding, padding, padding);
        return llParent;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return datas.size();
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     

    //加20个
    for(int i=0;i<20;i++){
        datas.add(i+"");
    }

    LinearLayout llParent = new LinearLayout(this);
    llParent.setOrientation(LinearLayout.VERTICAL);
    llParent.setGravity(Gravity.TOP);

    gridview = new PageGridView(this);      
    llParent.addView(gridview);     

    gridview.setNumColumns(GridView.AUTO_FIT);
    gridview.setVerticalSpacing(10);
    gridview.setHorizontalSpacing(15);
    //这里注意,一定要设置Gravity为Gravity.CENTER,否则不会出现页脚
    gridview.setGravity(Gravity.CENTER);

    gridview.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

            if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                // 滚动到底,请求下一页数据
                if (view.getLastVisiblePosition() == (view.getCount() - 1)) {                       
                    requestNextPage();
                }
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if(view.getLastVisiblePosition() != (view.getCount() - 1)){
                gridview.updateFooter(View.GONE);
            }
        }
    });
    // 添加并且显示
    gridview.setAdapter(adapter);

    setContentView(llParent);   

}

private void requestNextPage(){
    gridview.updateFooter(View.VISIBLE);
    new Thread(){
        @Override
        public void run() {             
            try {
                int length = datas.size();
                for(int i=length;i<length+20;i++){
                    datas.add(i+"");
                }
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            gridview.updateFooter(View.GONE);
        };
    }.start();
}   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值