MVP登录+recyclerview列表展示(带刷新效果)
2017-11-12 18:48
489 查看
//先看看布局
//主页面布局
//主页面布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context="com.example.weektwo.MainActivity"> <EditText android:id="@+id/et1" android:layout_width="300dp" android:layout_height="wrap_content" android:hint="Username of Email" /> <EditText android:id="@+id/et2" android:layout_width="300dp" android:layout_height="wrap_content" android:hint="PassWord"/> << 4000 strong>TextView [/b]android:layout_width="match_parent" android:layout_height="30dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center"> <Button android:id="@+id/but1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sign in" android:background="#f0ff00c8"/> <TextView android:layout_width="100dp" android:layout_height="wrap_content" /> <Button android:id="@+id/but2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#f0001eff" android:text="Twitter" /> </LinearLayout> </LinearLayout>
//有一个页面跳转,第二个页面布局,这里主要是recyclerview
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.weektwo.OtherActivity"> <com.liaoinstan.springview.widget.SpringView android:id="@+id/springview" android:layout_width="wrap_content" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </com.liaoinstan.springview.widget.SpringView> </android.support.constraint.ConstraintLayout>//获取图文的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:src="@mipmap/ic_launcher" android:scaleType="centerCrop" android:id="@+id/item_imageview" android:layout_width="match_parent" android:layout_height="100dp" /> <TextView android:background="@color/colorPrimary" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/item_textview"/> </LinearLayout>//接下来就是我们的方法
//话不多说直接上代码
//首先使我们的主方法MainActivity
package com.example.weektwo; import android.app.ProgressDialog; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.example.weektwo.Bean.User; import com.example.weektwo.Presenter.UserPresenter; import com.example.weektwo.View.IUserView; /** * *作者:瑾年 *时间:2017/11/11 10:01 * */ public class MainActivity extends AppCompatActivity implements IUserView,View.OnClickListener{ Button but1,but2; EditText et1,et2; private UserPresenter presenter; private ProgressDialog loginProgreess; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.but1).setOnClickListener(this); but2= (Button) findViewById(R.id.but2); et1= (EditText) findViewById(R.id.et1); et2= (EditText) findViewById(R.id.et2); presenter=new UserPresenter(this); } @Override public void onClick(View view) { String username = et1.getText().toString().trim(); String password = et2.getText().toString().trim(); if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) { Toast.makeText(getApplicationContext(), "账号或密码不能为空", Toast.LENGTH_SHORT).show(); return; } loginProgreess = ProgressDialog.show(this, "登录", "正在登录..."); presenter.login(new User(username, password)); } @Override public void onLoginSuccess() { loginProgreess.dismiss(); Intent intent=new Intent(MainActivity.this,OtherActivity.class); startActivity(intent); } @Override public void onLoginFailed(String error) { loginProgreess.dismiss(); Toast.makeText(getApplicationContext(), "登录失败:" + error, Toast.LENGTH_SHORT).show(); } }//这里的登录用到了MVP,所以要构造几个类
//首先使我们的User类,用来放用户名密码
package com.example.weektwo.Bean; /**
*作者:瑾年 * Created by lenovo on 2017/11/11. */ public class User { public User(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } private String username; private String password; }//接下来使我们的Model层
//IUserMode
package com.example.weektwo.Model; import com.example.weektwo.Bean.User; /** * *作者:瑾年 *时间:2017/11/11 10:01 * */ public interface IUserMode { String login(User user); }//UserMode
package com.example.weektwo.Model; import com.example.weektwo.Bean.User; /** * Created by lenovo on 2017/11/11. */ public class UserMode implements IUserMode{ @Override public String login(User user) { boolean networkError = false; //网络是否异常 try { Thread.sleep(3000);//模拟网络连接 if (networkError) { return "网络异常"; } else if ("mohan".equals(user.getUsername()) && "123456".equals(user.getPassword())) { return "true"; } else { return "账号或密码错误"; } } catch (InterruptedException e) { e.printStackTrace(); return e.getMessage(); } } }//Presenter层,也就是我们的P层
//UserPresenter
package com.example.weektwo.Presenter; import android.os.Handler; import android.os.Looper; import com.example.weektwo.Bean.User; import com.example.weektwo.Model.IUserMode; import com.example.weektwo.Model.UserMode; import com.example.weektwo.View.IUserView; /** * *作者:瑾年 *时间:2017/11/11 10:01 * */ public class UserPresenter { private final IUserView userView; private final IUserMode userMode; public UserPresenter(IUserView userView) { this.userView = userView; this.userMode = new UserMode(); } /** * 登录 * * @param user */ public void login(final User user) { new Thread() { @Override public void run() { final String res = userMode.login(user); new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { if ("true".equals(res)) { userView.onLoginSuccess(); } else { userView.onLoginFailed(res); } } }); } }.start(); } }//还有我们的V层,view
//IUserView
package com.example.weektwo.View; /** * Created by lenovo on 2017/11/11. */ public interface IUserView { /** * 登录成功 */ public void onLoginSuccess(); /** * 登录失败 * * @param error */ public void onLoginFailed(String error); }//接下来使我们的RecyclerView部分
//同样也有一个主方法,OtherActivity
package com.example.weektwo; import android.os.Build; import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.widget.LinearLayout; import android.widget.Toast; import com.liaoinstan.springview.container.DefaultFooter; import com.liaoinstan.springview.container.DefaultHeader; import com.liaoinstan.springview.widget.SpringView; import java.util.ArrayList; import java.util.List; /** * *作者:瑾年 *时间:2017/11/11 10:00 * */ public class OtherActivity extends AppCompatActivity { private RecyclerView recyclerView; private List<String> list = new ArrayList<>(); private SpringView springView; @RequiresApi(api = Build.VERSION_CODES.GINGERBREAD) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_other); recyclerView = (RecyclerView) findViewById(R.id.recyclerview); list.add("http://f10.baidu.com/it/u=2881303562,336932824&fm=72"); list.add("http://f11.baidu.com/it/u=681755471,2018070071&fm=72"); list.add("http://f10.baidu.com/it/u=960650584,863938083&fm=72"); list.add("http://img0.imgtn.bdimg.com/it/u=783060973,4278100629&fm=27&gp=0.jpg"); list.add("http://img1.imgtn.bdimg.com/it/u=3743124979,3234956668&fm=27&gp=0.jpg"); list.add("http://img4.imgtn.bdimg.com/it/u=3468613159,957707785&fm=27&gp=0.jpg"); list.add("http://img3.imgtn.bdimg.com/it/u=2971205354,485034289&fm=27&gp=0.jpg"); list.add("http://f10.baidu.com/it/u=2881303562,336932824&fm=72"); list.add("http://f11.baidu.com/it/u=681755471,2018070071&fm=72"); list.add("http://f10.baidu.com/it/u=960650584,863938083&fm=72"); list.add("http://img0.imgtn.bdimg.com/it/u=783060973,4278100629&fm=27&gp=0.jpg"); list.add("http://img1.imgtn.bdimg.com/it/u=3743124979,3234956668&fm=27&gp=0.jpg"); list.add("http://img4.imgtn.bdimg.com/it/u=3468613159,957707785&fm=27&gp=0.jpg"); list.add("http://img3.imgtn.bdimg.com/it/u=2971205354,485034289&fm=27&gp=0.jpg"); // 设置布局管理器 // new GridLayoutManager() 九宫格布局管理器 // new LinearLayoutManager() listview 布局管理器 // // new StaggeredGridLayoutManager() 瀑布流 布局管理器 // recyclerView.setLayoutManager(new GridLayoutManager(this,5)); recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL)); final RecyclerViewAdapter adapter = new RecyclerViewAdapter(this,list) ; // recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); recyclerView.setAdapter(adapter); adapter.setIListener(new RecyclerViewAdapter.Listener() { @Override public void onClick(View view, int position) { Toast.makeText(OtherActivity.this, ""+position, Toast.LENGTH_SHORT).show(); } @Override public void longClick(View view, int position) { } }); springView = (SpringView) findViewById(R.id.springview); springView.setHeader(new DefaultHeader(this)); springView.setFooter(new DefaultFooter(this)); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { //下啦 list.add("http://f10.baidu.com/it/u=2881303562,336932824&fm=72"); list.add("http://f11.baidu.com/it/u=681755471,2018070071&fm=72"); list.add("http://f10.baidu.com/it/u=960650584,863938083&fm=72"); list.add("http://img0.imgtn.bdimg.com/it/u=783060973,4278100629&fm=27&gp=0.jpg"); list.add("http://img1.imgtn.bdimg.com/it/u=3743124979,3234956668&fm=27&gp=0.jpg"); list.add("http://img4.imgtn.bdimg.com/it/u=3468613159,957707785&fm=27&gp=0.jpg"); list.add("http://img3.imgtn.bdimg.com/it/u=2971205354,485034289&fm=27&gp=0.jpg"); list.add("http://f10.baidu.com/it/u=2881303562,336932824&fm=72"); list.add("http://f11.baidu.com/it/u=681755471,2018070071&fm=72"); list.add("http://f10.baidu.com/it/u=960650584,863938083&fm=72"); list.add("http://img0.imgtn.bdimg.com/it/u=783060973,4278100629&fm=27&gp=0.jpg"); list.add("http://img1.imgtn.bdimg.com/it/u=3743124979,3234956668&fm=27&gp=0.jpg"); list.add("http://img4.imgtn.bdimg.com/it/u=3468613159,957707785&fm=27&gp=0.jpg"); list.add("http://img3.imgtn.bdimg.com/it/u=2971205354,485034289&fm=27&gp=0.jpg"); adapter.notifyDataSetChanged(); springView.onFinishFreshAndLoad(); } @Override public void onLoadmore() { //上啦 list.add("http://f10.baidu.com/it/u=2881303562,336932824&fm=72"); list.add("http://f11.baidu.com/it/u=681755471,2018070071&fm=72"); list.add("http://f10.baidu.com/it/u=960650584,863938083&fm=72"); list.add("http://img0.imgtn.bdimg.com/it/u=783060973,4278100629&fm=27&gp=0.jpg"); list.add("http://img1.imgtn.bdimg.com/it/u=3743124979,3234956668&fm=27&gp=0.jpg"); list.add("http://img4.imgtn.bdimg.com/it/u=3468613159,957707785&fm=27&gp=0.jpg"); list.add("http://img3.imgtn.bdimg.com/it/u=2971205354,485034289&fm=27&gp=0.jpg"); list.add("http://f10.baidu.com/it/u=2881303562,336932824&fm=72"); list.add("http://f11.baidu.com/it/u=681755471,2018070071&fm=72"); list.add("http://f10.baidu.com/it/u=960650584,863938083&fm=72"); list.add("http://img0.imgtn.bdimg.com/it/u=783060973,4278100629&fm=27&gp=0.jpg"); list.add("http://img1.imgtn.bdimg.com/it/u=3743124979,3234956668&fm=27&gp=0.jpg"); list.add("http://img4.imgtn.bdimg.com/it/u=3468613159,957707785&fm=27&gp=0.jpg"); list.add("http://img3.imgtn.bdimg.com/it/u=2971205354,485034289&fm=27&gp=0.jpg"); adapter.notifyDataSetChanged(); springView.onFinishFreshAndLoad(); } }); } }//RecyclerViewAdapter
package com.example.weektwo; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.bumptech.glide.Glide; import java.util.List; import java.util.Random; import butterknife.BindView; import butterknife.ButterKnife; import static java.security.AccessController.getContext; /** * *作者:瑾年 *时间:2017/11/11 10:00 * */ public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ImageViewHolder> { private Context context; private List<String> list; private int itemWidth ; public RecyclerViewAdapter(Context context, List<String> list) { this.context = context; this.list = list; WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); int width = wm.getDefaultDisplay().getWidth(); itemWidth = width / 3 ; } //创建ViewHolder @Override public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // 创建一个View View view = LayoutInflater.from(context).inflate(R.layout.layout_item, null); return new ImageViewHolder(view); } // 绑定view 显示数据 @Override public void onBindViewHolder(ImageViewHolder holder, final int position) { // 显示图片 Glide.with(context).load(list.get(position)).into(holder.itemImageview); ViewGroup.LayoutParams params = holder.itemImageview.getLayoutParams() ; int itemHeight = 300 ; itemHeight = new Random().nextInt(500); if(itemHeight < 300){ itemHeight = 300 ; } params.width = itemWidth ; params.height = itemHeight ; holder.itemImageview.setLayoutParams(params); holder.itemImageview.setImageResource(R.mipmap.ic_launcher); // ImageLoader.getInstance().displayImage(list.get(position),holder.itemImageview); holder.textView.setText(position+""); holder.itemImageview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(listener != null){ listener.onClick(view,position); } } }); holder.itemImageview.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { listener.longClick(view,position); return false; } }); } // 获取条目的个数 @Override public int getItemCount() { return list.size(); } static class ImageViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.item_imageview) ImageView itemImageview; @BindView(R.id.item_textview) TextView textView; public ImageViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); // itemImageview = itemView.findViewById(R.id.item_imageview); } } private Listener listener ; public void setIListener(Listener listener){ this.listener = listener; } public interface Listener { public void onClick(View view, int position); public void longClick(View view, int position); } }//TestAdapter
package com.example.weektwo; import android.support.v7.widget.RecyclerView; import android.view.ViewGroup; /** * *作者:瑾年 *时间:2017/11/11 10:00 * */ public class TestAdapter extendsRecyclerView.Adapter { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } @Override public int getItemCount() { return 0; } }//做recyclerView的时候用的死数据,大家可以找个接口,用okHttp去完善一下
//还有不要忘了导依赖,下面给大家看看我这里边所用到的依赖。
//recyclerview依赖 compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' //butterknife依赖 compile 'com.jakewharton:butterknife:8.1.0' apt 'com.jakewharton:butterknife-compiler:8.1.0' //gpuimage依赖 compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.3.0' //glide依赖 compile 'jp.wasabeef:glide-transformations:2.0.1' //springview依赖 compile 'com.liaoinstan.springview:library:1.3.0' configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> def requested = details.requested if (requested.group == 'com.android.support') { if (!requested.name .startsWith("multidex")) { details.useVersion '25.3.0' } } } } //导入总工程 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
相关文章推荐
- 展示数据使用:recyclerview,retrofit,greendao,butterknife,eventbus,fresco。实现效果图列表。MVP模式。
- Android RecyclerView实现数据列表展示效果
- MVP和sqlite数据库,XRecyclerView上啦加载下拉刷新的第三方注册登录,列表
- Android实现RecyclerView下拉刷新效果
- 实战MVP请求数据OKHttp封装RecyclerView上拉刷新下拉加载
- 使用ScrollView制作Title渐变,配合RecyclerView展示列表
- RecyclerView展示固定数据、上拉加载更多、下拉刷新、点击事件、长按点击事件、删除条目、刷新条目、添加条目、多条目加载
- GreenDao,注解,RecyclerView,EventBus,Retrofit展示列表
- Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)
- <android>RecyclerView列表局部刷新
- MVP+XRecyclerView+okhttp+glide,列表或者网格显示所加载的数据
- MVP模式的OKhttp请求网络数据,xrecyclerview上拉刷新,下拉加载
- Android RecyclerView (二)初学,实现GridView列表和瀑布流效果。
- MVP+Retrofit+ReJava+Xrecyclerview请求展示数据
- Android 使用RecyclerView实现列表item重叠效果(使用addItemDecoration方法)
- 自定义Adapter实现RecyclerView的可展开二级列表expand效果
- Android客户端之“微服私访”App的系统学习(六)RecyclerView 展现复杂数据列表以及水波纹效果+CardView显示头像
- 使用MVP注册登录模块+封装的OKhttp,拦截器+QQ第三方登录+RecyclerView+SpringView上拉加载下拉刷新网络数据
- RecyclerView+ImageLoader图片列表的加载与展示【从listview加载图片性能优化引出的解决方法】
- RecyclerView条目跳转+SpringView数据刷新加载+MVP+OKhttp+拦截器+自定义view 实现请求网络数据的二级列表购物车