您的位置:首页 > 理论基础 > 计算机网络

recyclerview+okhttp+glide实现网络请求加载图片列表

2017-09-19 09:04 741 查看
导入依赖

compile 'com.squareup.okhttp3:okhttp:3.8.1'

compile 'com.google.code.gson:gson:2.8.1'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.github.bumptech.glide:glide:3.8.0'

权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
main布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.w.myapplication2.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</RelativeLayout>
recyclerview适配器
public class MyAdapter extends RecyclerView.Adapter{
private View view;
private Context mcontext;
private ArrayList<Bean.StoriesBean> mlist=new ArrayList<>();
private OnItemClickListener mClickListener;

public MyAdapter(Context mcontext, ArrayList<Bean.StoriesBean> list) {
this.mcontext = mcontext;
this.mlist=list;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mcontext).inflate(R.layout.item, null);
return new ViewHolder(view,mClickListener);

}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
ViewHolder viewholder= (ViewHolder)holder;
viewholder.textview.setText(""+mlist.get(position).getTitle());
Glide.with(mcontext).load(getItem(position).getImages().get(0)).into(viewholder.ima);
//只给标题设置的点击事件
/*   viewholder.textview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mcontext, mlist.get(position).getTitle(), Toast.LENGTH_SHORT).show();
}
});*/

}
//手写的重置数据的方法
public void setdata(ArrayList<Bean.StoriesBean> list){
if (list!=null&&list.size()>0){
mlist.addAll(list);
}

}
//手写的获得视图的方法
public Bean.StoriesBean getItem(int position){
return mlist.get(position);

};

@Override
public int getItemCount() {
return mlist.size();
}
//自定义的方法
public void setOnItemClickListener(OnItemClickListener listener){
this.mClickListener=listener;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
private OnItemClickListener mListener;// 声明自定义的接口

private TextView textview;
private ImageView ima;
//把定义的接口作为参数放到方法内
public ViewHolder(View itemView,OnItemClickListener  listener) {
super(itemView);

mListener=listener;
//给item设置点击事件
itemView.setOnClickListener(this);

textview=(TextView)itemView.findViewById(R.id.textView);
ima=(ImageView)itemView.findViewById(R.id.imageView);
}

@Override
public void onClick(View v) {
// getpostion()为Viewholder自带的一个方法,用来获取RecyclerView当前的位置,将此作为参数,传出去
mListener.onItemClick(v,getPosition());

}
}
//手写的一个接口
public interface OnItemClickListener {
public void onItemClick(View view, int postion);
}
}
okhttp工具类
//OKHttp工具类
public class OKHttp {
public void getdata(String url, final MainActivity netDataCallback) {
//初始化一个 OkHttpClient 并且设置连接和读取超时时间
OkHttpClient okhttp = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.build();
//构造一个Request对象
Request request = new Request.Builder().url(url).build();
//通过request的对象去构造得到一个Call对象
Call call=okhttp.newCall(request);
//调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
netDataCallback.err(500,e.getMessage());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String  s = response.body().string();
netDataCallback.callback(s);
}
});
}
public interface NetDataCallback {
void callback(String str);
void err(int code,String s);
}
}

recyclerview的布局管理器(不能忽视)

public class AppManager {

// Activity栈
private static Stack<Activity> activityStack;
// 单例模式
private static AppManager instance;

private AppManager() {
}

/**
* 单一实例
*/
public static AppManager getAppManager() {
if (instance == null) {
instance = new AppManager();
}
return instance;
}

/**
* 添加Activity到堆栈
*/
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}

/**
* 获取当前Activity(堆栈中最后一个压入的)
*/
public Activity currentActivity() {
Activity activity = activityStack.lastElement();
return activity;
}

/**
* 结束当前Activity(堆栈中最后一个压入的)
*/
public void finishActivity() {
Activity activity = activityStack.lastElement();
finishActivity(activity);
}

/**
* 结束指定的Activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}

/**
* 结束指定类名的Activity
*/
public void finishActivity(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
break;
}
}
}

/**
* 结束所有Activity
*/
public void finishAllActivity() {
for (int i = 0; i < activityStack.size(); i++) {
if (null != activityStack.get(i)) {
activityStack.get(i).finish();
}
}
activityStack.clear();
}

/**
* 退出应用程序
*/
public void AppExit(Context context) {
try {
finishAllActivity();
//退出程序
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
} catch (Exception e) {
}
}
}
main代码
public class MainActivity extends AppCompatActivity {
private RecyclerView mrv;
private String url="https://news-at.zhihu.com/api/4/news/latest";
private MyAdapter md;
private OKHttp http;
private ArrayList<Bean.StoriesBean> mlist=new ArrayList<>();
public Handler hand=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==1){
Gson gson=new Gson();
Bean bean = gson.fromJson(msg.obj.toString(), Bean.class);
// mlist=(ArrayList<NewsData.DataBean>) newsData.getData();
mlist=(ArrayList<Bean.StoriesBean>) bean.getStories();
md.setdata((ArrayList<Bean.StoriesBean>) mlist);
md.notifyDataSetChanged();

}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mrv=(RecyclerView)findViewById(R.id.recy);
initdata();
mrv.setLayoutManager(new LinearLayoutManager(this));
md=new MyAdapter(this,mlist);
mrv.setAdapter(md);

//RecyclerView条目的点击事件
md.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int postion) {
Toast.makeText(MainActivity.this, mlist.get(postion).getTitle(), Toast.LENGTH_SHORT).show();
}
});
}
private void initdata() {
OKHttp http=new OKHttp();
http.getdata(url, this);
}
public void callback(String str) {
Message msg = Message.obtain();
msg.what=1;
msg.obj=str;
hand.sendMessage(msg);

}
public void err(int code, String s) {

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐