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)
上一篇的地址:http://blog.csdn.net/qq_32515625/article/details/79580482
这是我的布局,如果在你的里面,请记得更改包名<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
相关文章推荐
- Android 三种方式实现自定义圆形页面加载中效果的进度条
- [Java][Android][Process] 暴力的服务可以解决一切,暴力的方式执行命令行语句
- Android 三种方式实现自定义圆形页面加载中效果的进度条
- Android 同时加载多个webview 加载很慢解决方式
- 完美解决Android的WebView加载失败(404,500),显示的自定义视图
- Android 解决TextVIew加载自定义字体慢的问题
- Android 三种方式实现自定义圆形页面加载中效果的进度条
- 你也可以自己写一个可爱 & 小资风格的Android加载等待自定义View
- Android进阶——自定义Loader以一种更优美的方式异步加载不同类型的数据(二)
- 完美解决Android的WebView加载失败(404,500),显示的自定义视图
- Android滑动冲突解决方式(下拉刷新上拉加载更多,适配RecyclerView/ListView/ScrollView)
- android中listview滑动到底部自动加载数据后它的滑块自动回到第一项怎么解决?
- 你也可以自己写一个可爱 & 小资风格的Android加载等待自定义View
- android 自定义弹出框被系统底部虚拟键盘挡住、Pad上点击空白区域弹出框不dismiss BUG解决
- 完美解决Android的WebView加载失败(404,500),显示的自定义视图
- 你也可以自己写一个可爱 & 小资风格的Android加载等待自定义View - 转
- Android 三种方式实现自定义圆形页面加载中效果的进度条
- 在加载Android studio程序的时候,会爆出这个的错误的解决方式
- Android 三种方式实现自定义圆形页面加载中效果的进度条
- 三种方式实现自定义圆形页面加载中效果的进度条,包含一个好看的Android UI