MVPXlistView展示上拉下拉效果

本文实例为大家分享了MVPXlistView上拉下拉展示的具体代码,供大家参考,具体内容如下

抽基类

package com.gs.gg.day8.back;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

public abstract class BackActivity extends AppCompatActivity {
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  init();
 }

 protected abstract int getLayout();
 protected abstract void initViews();
 protected abstract void setOnClick();
 protected abstract void processLogic();
 void init(){
  if (getLayout()!=0){
   setContentView(getLayout());
   initViews();
   setOnClick();
   processLogic();
  }else {
   throw new IllegalStateException("请加载布局文件");
  }
 }
}

Model

package com.gs.gg.day8.model;

import com.gs.gg.day8.callbase.MyCallBase;

public interface Model {
 void getData(String mUrl,String parants,MyCallBase callBase);
}

MyCallBase

package com.gs.gg.day8.callbase;

import com.gs.gg.day8.bean.User;

public interface MyCallBase {
 void setData(User data);
 void setError(String error);
}

Modelimpl

package com.gs.gg.day8.model;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import com.google.gson.Gson;
import com.gs.gg.day8.R;
import com.gs.gg.day8.bean.User;
import com.gs.gg.day8.callbase.MyCallBase;
import com.gs.gg.day8.util.HttpUtils;

import java.net.URL;

public class Modelimpl implements Model {
 private Handler handler=new Handler(){
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   String JsonStr= (String) msg.obj;
   Gson gson=new Gson();
   User user= gson.fromJson(JsonStr,User.class);
   callBase.setData(user);
  }
 };
 private MyCallBase callBase;
 @Override
 public void getData(final String mUrl, String parants, final MyCallBase callBase) {
  this.callBase=callBase;
  new Thread(new Runnable() {
   @Override
   public void run() {
    try {
     String json = HttpUtils.get(mUrl);
     handler.sendMessage(handler.obtainMessage(0,json));
    } catch (Exception e) {
     Looper.prepare();
     callBase.setError("异常");
     Looper.loop();
    }
   }
  }).start();
 }
}

HttpUtils

package com.gs.gg.day8.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpUtils {
 public static String get(String mUrl) throws Exception {
  URL url=new URL(mUrl);
  HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  //设置请求方式
  connection.setRequestMethod("GET");
  connection.setConnectTimeout(5000);
  InputStream stream = connection.getInputStream();
  String inputStr = getInputStr(stream);
  return inputStr;
 }

 //把流转成字符串
 private static String getInputStr(InputStream stream) throws IOException {
  BufferedReader br = new BufferedReader(new InputStreamReader(stream));
  StringBuffer sb = new StringBuffer();
  String str = null;
  while ((str = br.readLine()) != null) {
   sb.append(str);
  }
  return sb.toString();
 }
}

IView

package com.gs.gg.day8.view;

import com.gs.gg.day8.bean.User;

public interface IView {
 void success(User data);
 void error(String error);
}

Presenter

package com.gs.gg.day8.presenter;

public interface Presenter {
 void startReponse(String url,String parants);
}

PresenterImpl

package com.gs.gg.day8.presenter;

import com.gs.gg.day8.bean.User;
import com.gs.gg.day8.callbase.MyCallBase;
import com.gs.gg.day8.model.Modelimpl;
import com.gs.gg.day8.view.IView;

public class PresenterImpl implements Presenter {
 private IView iView;
 private Modelimpl model;

 public PresenterImpl(IView iView) {
  this.iView = iView;
  model = new Modelimpl();
 }

 @Override
 public void startReponse(String mUrl, String parants) {
  model.getData(mUrl,parants, new MyCallBase() {
   @Override
   public void setData(User data) {
    iView.success(data);
   }

   @Override
   public void setError(String error) {
    iView.error(error);
   }
  });
 }
 public void onDotch(){
  if (iView!=null){
   iView=null;
  }
  if (model!=null){
   model=null;
  }
 }
}

MainActivity

package com.gs.gg.day8;

import android.widget.Toast;

import com.gs.gg.day8.adapter.MyAdapter;
import com.gs.gg.day8.back.BackActivity;
import com.gs.gg.day8.bean.User;
import com.gs.gg.day8.presenter.PresenterImpl;
import com.gs.gg.day8.view.IView;
import com.gs.gg.myxlist.me.maxwin.view.XListView;

import java.util.ArrayList;

public class MainActivity extends BackActivity implements IView,XListView.IXListViewListener {

 private XListView xlist_item;
 private PresenterImpl presenter;
 private ArrayList<User.DataBean> mlist=new ArrayList<>();
 private String muUrl="http://www.xieast.com/api/news/news.php?page=";
 private int i=1;
 private MyAdapter adapter;

 @Override
 protected int getLayout() {
  return R.layout.activity_main;
 }

 @Override
 protected void initViews() {
  xlist_item = findViewById(R.id.Xlist_item);
 }

 @Override
 protected void setOnClick() {
  xlist_item.setPullLoadEnable(true);
  xlist_item.setXListViewListener(this);
 }

 @Override
 protected void processLogic() {
  presenter = new PresenterImpl(this);
  adapter = new MyAdapter(MainActivity.this,mlist);
  xlist_item.setAdapter(adapter);
  presenter.startReponse(muUrl+i, null);
 }

 @Override
 public void success(User data) {
  mlist.addAll(data.getData());
  adapter.notifyDataSetChanged();
  stop();
 }

 @Override
 public void error(String error) {
  Toast.makeText(this, "异常", Toast.LENGTH_SHORT).show();
 }
 private void stop() {
  xlist_item.stopRefresh();
  xlist_item.stopLoadMore();
 }

 @Override
 public void onRefresh() {
  i = 1;
  mlist.clear();
  presenter.startReponse(muUrl + i, null);
 }

 @Override
 public void onLoadMore() {
  i++;
  presenter.startReponse(muUrl + i, null);
 }
}

MyAdapter

package com.gs.gg.day8.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.gs.gg.day8.R;
import com.gs.gg.day8.bean.User;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.ArrayList;

public class MyAdapter extends BaseAdapter {
 public MyAdapter(Context context, ArrayList<User.DataBean> mlist) {
  this.context = context;
  this.mlist = mlist;
 }

 private Context context;
 private ArrayList<User.DataBean> mlist;

 @Override
 public int getCount() {
  return mlist.size();
 }

 @Override
 public Object getItem(int position) {
  return mlist.get(position);
 }

 @Override
 public long getItemId(int position) {
  return position;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  HolderView holder=null;
  if (convertView==null){
   convertView= View.inflate(context, R.layout.item,null);
   holder=new HolderView();
   holder.textName=convertView.findViewById(R.id.text);
   holder.imageName=convertView.findViewById(R.id.image);
   convertView.setTag(holder);
  }else {
   holder= (HolderView) convertView.getTag();
  }
  User.DataBean bean = mlist.get(position);
  holder.textName.setText(bean.getTitle());
  ImageLoader.getInstance().displayImage(mlist.get(position).getThumbnail_pic_s(),holder.imageName);
  return convertView;
 }
 class HolderView{
  TextView textName;
  ImageView imageName;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android通过代码控制ListView上下滚动的方法

    本文将介绍一种通过代码控制ListView上下滚动的方法. 先上图: 按下按钮会触发ListView滚动或停止. 实现该功能并不难,下面给出主要代码MainActivity.java package cn.guet.levide; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View;

  • Android ListView适配器(Adapter)优化方法详解

    Android ListView的优化,在做Android项目的时候,在用到ListView 界面及数据显示,这个时候如果资源过大,对项目来说,用户体验肯定是不好的,这里就对如何优化做了详细介绍: Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View.想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源? ListView的Adapter的作用如下图所示: 先看看下面

  • Android ListView和Adapter数据适配器的简单介绍

    ListView 显示大量相同格式数据 常用属性: listSelector listView每项在选中.按下等不同状态时的Drawable divider ListView每项间的间隔Drawable dividerHeight ListView每项间间隔的间隔高度 常用方法: setAdapter() 设置数据适配器 setOnItemClickListener() 设置每项点击事件监听 addHeaderView() 添加头视图 addFooterView() 添加脚视图 setEmpty

  • Android解决ScrollView下嵌套ListView和GridView中内容显示不全的问题

    最近为公司做的一个Demo里面用到了ScrollView嵌套了GridView和ListView,然而在嵌套的时候我发现GridView和ListView都是不能完全显示,显示的基本上都是单行的数据,最后查找资料和翻阅文档看到原因是ListView和GridView的绘制过程中在ScrollView中无法准确的测量自身的高度,而且listVIew和GridView抢占了焦点,使得ListView和GrideView具有自身的显示的效果,这样就测量出显示一行条目即可的距离,其他的条目根据自身的滑动

  • Android自定义控件ListView下拉刷新的代码

    ListView在实际实用中,一般都会有下新刷新和上拉加载的动态效果,今天要学的就是如何自定义带下拉刷新的ListView. 原理解析:一般将有下拉刷新的listview分成四种不同的状态来进行不同的显示效果. 1.完成状态done:listview正常显示状态 2.下拉状态pull:listview正在下拉时的状态 3.释放状态release:listview下拉后松开的状态 4.更新状态refreshing:listview下拉后加载数据时的状态 实现步骤: 自定义CustomListVie

  • Android巧用XListView实现万能下拉刷新控件

    摘要:想必大家做开发的时候都会用到下拉刷新的控件,现在各种第三方的下拉刷新控件不胜枚举.当然最NB的还是XListView.其他也有针对GridView,ScrollView,LinearLayout进行重写的下拉刷新控件.本文针对xListView采取一种巧用办法,可以实现各种控件的下拉刷新. 这种巧用思路有人可能已经想到,因为ListView本身就有addHeaderView方法,用该方法我们可以添加任何布局的View.因此本文的思路就是往xListView的头部添加我们自定义写的布局文件.

  • 详解xamarin Android 实现ListView万能适配器

    详解xamarin Android 实现ListView万能适配器 早些时候接触xamarin Android 的列表,写了很多ListView的Adapter,建一个ListView就写一个Adapter,每一个Adapter里面还有去写一个ViewHolder的类来优化,自从看了hongyang博客的listview万能适配器的文章,学习良多,所以就写篇关于xamarin android ListView通用适配器的文章. 本章主要分为以下三点: 打造通用的ViewHolder优化ListV

  • Android ListView万能适配器实例代码

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的Adapter继承于BaseAdapter,下面是自定义的Adapter,精华在getView()方法中 package com.example.mylistview.util; import java.util.List; import android.content.Context; impor

  • android使用flutter的ListView实现滚动列表的示例代码

    现如今打开一个 App,比如头条.微博,都会有长列表,随着我们不断地滑动,视窗内的内容也会不断地更新.今天就用 Flutter 实现一下这种效果. 这里的表现其实就相当于有一个固定长度的容器,然后超出的内容是不可见的,只有当你向上或向下滑动屏幕时,视窗外看不见的内容才会出现在视窗中.如果在 web 开发时,是需要容器加上样式 overflow: auto; 要想用 Flutter 实现,其实也是很简单的,因为 Flutter 为我们提供了 ListView 组件. ListView 主要有以下几

  • ListView通用泛型适配器

    还记得我们之前说的ListView吗,(这个难用的控件-.+)我们在用他的同时也用到了一个叫做适配器Adapter的东西.一般我们用一个类继承BaseAdapter,来进行数据和控件的适配. 但是我们每一种适配器都只是为了适配一种数据源和一种布局,如果用到的少还好,如果要用到十几种,我们是不是要写十几个适配器呢?这个想法真的是太蠢了! 有一种适配器写法,可以做到一个适配器与多种类型数据和布局进行适配,这个东西叫做通用适配器(因为他是用到泛型实现的,我称他为泛型适配器),今天我们来看一下这种适配器

随机推荐