您的位置:首页 > 移动开发 > Android开发

Android 上拉加载的可以自定义底部的解决方式(2)

2018-03-16 14:33 405 查看
这是个上一个相关的一个上拉加载,要说的都在上一个说了,如果你要使用,一定稍微看看上一个的例子,或者看看我在使用时的例子。ok

这是我的布局,如果在你的里面,请记得更改包名<com.example.rtyui.glide.ListViewUploadDefine
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lst"/>我自己认为这是一个比上一个更好用的东西,,详细的代码注释请看上一篇package com.example.rtyui.glide;

import android.content.Context;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.util.concurrent.ExecutorService;

/**
* Created by 蒲公英 on 2017/5/31.
*/

public class ListViewUploadDefine extends ListView {
private final int LOAD = 100002;
private final int FAIL = 100007;

public static final int BADDATA = -1;

private View footer = null;

private int STEP = 0;
private ExecutorService executors = null;

/**
* 比上一个多了一个底部view
* @param doload
* @param STEP
* @param executors
* @param footer
*/
public void initInPool(Doload doload, int STEP, ExecutorService executors, View footer) {
this.doload = doload;
this.STEP = STEP;
this.executors = executors;
this.footer = footer;
addFooter();
footer.setVisibility(GONE);
new MyAsyncTask().executeOnExecutor(this.executors);
}

/**
* 同上
* @param doload
* @param STEP
* @param footer
*/
public void init(Doload doload, int STEP,View footer) {
this.doload = doload;
this.STEP = STEP;
this.footer = footer;
addFooter();
footer.setVisibility(GONE);
new MyAsyncTask().execute();
}

//标记是不是还能进行加载
private boolean CAN = false;

//起点
private float start = 0;

//最大高度 测量得到
private int highest = 0;

//大小设置工具
private LayoutParams layoutParams = null;

public ListViewUploadDefine(Context context) {
super(context);
}

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

public ListViewUploadDefine(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

//外部接口
public interface Doload{
int load();
void finish();

void initFooter();
void beginFooter();
void loadFooter();
void failFooter();
void victoryFooter();
void endFooter();
}

private Doload doload;

//重写布局完成
@Override
protected void onFinishInflate() {
super.onFinishInflate();

}

private void addFooter(){
this.addFooterView(footer, null, false);
//添加
this.setFooterDividersEnabled(false);

//测量
footer.measure(0 , 0);

highest = footer.getMeasuredHeight();

//初始化param
layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
if (this.getLastVisiblePosition() == this.getCount() - 1 && CAN)
{
start = ev.getY();
System.out.println(this.getCount() + this.getLastVisiblePosition());
}
break;
case MotionEvent.ACTION_MOVE:
if (start > 0)
{
float move = ev.getY() - start;
if (move < 0 && move > -highest){
footer.setVisibility(VISIBLE);
set_foot((int) -move);
doload.initFooter();
}
if (move < -highest) {
footer.setVisibility(VISIBLE);
set_foot(highest);
doload.beginFooter();
}
}
break;
case MotionEvent.ACTION_UP:
if (start > 0) {
if ((ev.getY() - start) < -highest) {
if (this.executors == null){
new MyAsyncTask().execute();
}else{
new MyAsyncTask().executeOnExecutor(this.executors);
}
}
}
break;
}
return super.onTouchEvent(ev);
}

//设置底部高度
private void set_foot(int height){
layoutParams.height = height;
footer.setLayoutParams(layoutParams);
}

private class MyAsyncTask extends AsyncTask<Void, Integer, Integer> {

@Override
protected Integer doInBackground(Void... objects) {
publishProgress(LOAD);
int sign = doload.load();
if (sign == -1) {
publishProgress(FAIL);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return sign;
}

@Override
protected void onProgressUpdate(Integer... pros) {
super.onProgressUpdate(pros);
switch (pros[0]) {
case LOAD:
footer.setVisibility(VISIBLE);
CAN = false;
start = 0;
set_foot(highest);
doload.loadFooter();
break;
case FAIL:
footer.setVisibility(VISIBLE);
set_foot(highest);
doload.failFooter();
break;
}
}

@Override
protected void onPostExecute(Integer count) {
super.onPostExecute(count);
doload.finish();
start = 0;
if (count == STEP || count == BADDATA) {
CAN = true;
set_foot(1);footer.setVisibility(GONE);
doload.victoryFooter();
return;
} else {
footer.setVisibility(VISIBLE);
CAN = false;
set_foot(highest);
doload.endFooter();
}
}
}
}

我自己的应用(别忘了自己定义一个adapter)
        listViewUpload = findViewById(R.id.lst);
    
listViewUpload.setAdapter(myAdapter = new MyAdapter());

final View view = LayoutInflater.from(this).inflate(R.layout.listview_footer, null);
listViewUpload.initInPool(
new ListViewUploadDefine.Doload() {
@Override
public int load() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int times = (int) (Math.random() * 3 % 3 + 9);
if (times == 11) {
return ListViewUploadDefine.BADDATA;
}
for (int i = 0; i < times; i++) {
strings.add(i + "");
}
return times;
}
@Override
public void finish() {
myAdapter.notifyDataSetChanged();
}

@Override
public void initFooter() {
view.findViewById(R.id.pro).setVisibility(View.VISIBLE);
((TextView)view.findViewById(R.id.txt)).setText("上拉松开加载");
}

@Override
public void beginFooter() {
view.findViewById(R.id.pro).setVisibility(View.VISIBLE);

4000
((TextView)view.findViewById(R.id.txt)).setText("松开加载");
}

@Override
public void loadFooter() {
view.findViewById(R.id.pro).setVisibility(View.VISIBLE);
((TextView)view.findViewById(R.id.txt)).setText("加载中...");
}

@Override
public void failFooter() {
view.findViewById(R.id.pro).setVisibility(View.GONE);
((TextView)view.findViewById(R.id.txt)).setText("请检查的网络连接");
}

@Override
public void victoryFooter() {
Toast.makeText(MainActivity.this, "加载成功", Toast.LENGTH_SHORT).show();
}

@Override
public void endFooter() {
view.findViewById(R.id.pro).setVisibility(View.GONE);
((TextView)view.findViewById(R.id.txt)).setText("已经没有更多内容了");
}
}, 10, App.executorService, view);
listViewUpload.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
System.out.println("position");
}
});
还是同样写在下面的话,如果你发现有什么问题或者什么建议,请写在下面,我如果看到了一定会回复的,大家共同交流,也希望能帮助到一些伙伴们。

上一篇的地址:http://blog.csdn.net/qq_32515625/article/details/79580482
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐