1.MianActivity
package com.example.lenovo.recyclerviewweek3.mvp.view; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.widget.LinearLayout; import android.widget.Toast; import com.example.lenovo.recyclerviewweek3.R; import com.example.lenovo.recyclerviewweek3.mvp.adapter.NewsAdapter; import com.example.lenovo.recyclerviewweek3.mvp.bean.News; import com.example.lenovo.recyclerviewweek3.mvp.presenter.RecyclerPresenter; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements IView{ private RecyclerView rvList; private List<News.DataBean> list; private RecyclerPresenter presenter; private NewsAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rvList = findViewById(R.id.rv_list); initData(); list = new ArrayList<>(); //适配器 adapter = new NewsAdapter(this,list); //瀑布流管理器 RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(2, LinearLayoutManager.VERTICAL); //添加管理器 rvList.setLayoutManager(layoutManager); rvList.setAdapter(adapter); } private void initData() { presenter = new RecyclerPresenter(); presenter.attach(this); presenter.getNews(); } @Override public void success(List<News.DataBean> dataBeans) { list.addAll(dataBeans); adapter.notifyDataSetChanged(); } @Override public void faied(Exception e) { Toast.makeText(this, "网络异常" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }
2.Adapter
package com.example.lenovo.recyclerviewweek3.mvp.adapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.lenovo.recyclerviewweek3.R; import com.example.lenovo.recyclerviewweek3.mvp.bean.News; import java.util.List; /** * */ public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.Holder>{ private Context context; private List<News.DataBean> list; public NewsAdapter(Context context, List<News.DataBean> list) { this.context = context; this.list = list; } @NonNull @Override public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View v = View.inflate(context, R.layout.item_recycler,null); return new Holder(v); } @Override public void onBindViewHolder(@NonNull Holder holder, int position) { holder.txtTitle.setText(list.get(position).getTitle()); Glide.with(context).load(list.get(position).getThumbnail01()).into(holder.imgLogo); } @Override public int getItemCount() { return list.size(); } class Holder extends RecyclerView.ViewHolder{ private final ImageView imgLogo; private final TextView txtTitle; public Holder(View itemView) { super(itemView); imgLogo = itemView.findViewById(R.id.img_logo); txtTitle = itemView.findViewById(R.id.txt_Title); } } }
3 .ICallBack
public interface ICallBack { void onsuccess(Object obj); void onfaied(Exception e); }
4 IView
public interface IView { void success(List<News.DataBean> list); void faied(Exception e); }
5 Utils
package com.example.lenovo.recyclerviewweek3.mvp.utils; import android.os.Handler; import com.example.lenovo.recyclerviewweek3.mvp.inter.ICallBack; import com.google.gson.Gson; import java.io.IOException; import java.lang.reflect.Type; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * */ public class HttpUtils { private static volatile HttpUtils instance; private Handler handler = new Handler(); private OkHttpClient client; private HttpUtils(){ client = new OkHttpClient(); } public static HttpUtils getInstance(){ if (instance == null){ synchronized (HttpUtils.class){ if (null == instance){ instance = new HttpUtils(); } } } return instance; } public void get(String url, final ICallBack callBack , final Type type){ final Request request = new Request.Builder() .get() .url(url) .build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { callBack.onfaied(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); Gson gson = new Gson(); final Object o = gson.fromJson(result, type); handler.post(new Runnable() { @Override public void run() { callBack.onsuccess(o); } }); } }); } }
6 Model
public class RecyclerModel { public void getData(String url, ICallBack callBack, Type type){ HttpUtils.getInstance().get(url,callBack,type); } }
7 .Presenter
package com.example.lenovo.recyclerviewweek3.mvp.presenter; import com.example.lenovo.recyclerviewweek3.mvp.bean.News; import com.example.lenovo.recyclerviewweek3.mvp.inter.ICallBack; import com.example.lenovo.recyclerviewweek3.mvp.model.RecyclerModel; import com.example.lenovo.recyclerviewweek3.mvp.view.IView; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.List; /** * */ public class RecyclerPresenter { private IView iv; private RecyclerModel model; public void attach(IView iv){ this.iv=iv; model = new RecyclerModel(); } public void getNews(){ Type type = new TypeToken<News>(){}.getType(); model.getData("http://www.xieast.com/api/news/news.php?type=top&page=1", new ICallBack() { @Override public void onsuccess(Object obj) { News news = (News) obj; if (news !=null){ List<News.DataBean> list = news.getData(); iv.success(list); } } @Override public void onfaied(Exception e) { iv.faied(e); } },type); } }
// recyclerview
// 1. 线性布局管理器,默认一个参数的构造方法实现效果和ListView相似, 默认是纵向的
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
// 第一个参数是上下文,第二个参数是控制线性布局管理器的方向,第三个参数是是否反转
// RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true);
// 2. 网格布局管理器,默认两个参数的构造方法和GridView类似,第二个参数是列数
// RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 3);
// 第二个参数是列数,第三个是方向,第四个是是否反转
// RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 3, LinearLayoutManager.HORIZONTAL, true);
// 3. 瀑布流管理器,只有两个参数的构造方法,第一个是列数,第二个是方向
// RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL);
rvNews.setLayoutManager(layoutManager);
// 添加默认条目分割线
rvNews.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
// 默认条目动画效果
rvNews.setItemAnimator(new DefaultItemAnimator());
// 设置支持上拉加载更多
rvNews.setLoadingMoreEnabled(true);
// 设置支持下拉刷新
rvNews.setPullRefreshEnabled(true);