大前天星期六,正好有两天的时间,把这几天学的学习RecyclerView的小知识点综合一下吧,然后就准备写一个搜索新闻浏览的功能,一切都顺利到星期天中午就差不多了,但是问题就来了。
怎么也没有办法将图片一一的显示出来,然后就查代码,就是不行,实在是没办法,老是下标越界,将那几个都查了好几遍还是不知道怎么回事,昨天改到晚上一点多还
是不行。实在不知道咋回事,还有一个问题就是在代码复杂后就不知道怎么往UI线程里进行发送了,导致的结果就是,当按下搜索后,新闻是弹不出来的,只有将UI刷新
一下后才能进行显示在UI上,以上诸多问题希望大神帮我找出虫子。
网络数据来源:聚合数据 360新闻 Api
整个程序中主要是利用的知识点有:RecyclerView Volley Gson ;
compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.android.support:recyclerview-v7:23.4.0'
一、先从RecyclerView适配器做个开头
package com.hejingzhou.simplyapp.adapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.hejingzhou.simplyapp.R;
import com.hejingzhou.simplyapp.activity.MainActivity;
import java.util.List;
/**
* Created by Hejingzhou on 2016/5/28.
*/
public class NewsItemAdapter extends RecyclerView.Adapter<MyViewHolder> {
private LayoutInflater layoutInflater;
private Context context;
private List<String> imageUrl, imageWidth, imageHeight, title, content, newsUrl, newsSource, pdate, pdate_src;
private List<Bitmap> bitmaps;
private String TAG = getClass().getCanonicalName();
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
private OnItemClickListener mOnItemClickListener;
public void setOnItemListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
/***
* @param context 上下文
* @param imageUrl 图Url
* @param imageWidth 图宽
* @param imageHeight 图高
* @param title 标题
* @param content 正文预览
* @param newsUrl 新闻Url
* @param newsSource 报社
* @param pdate 大概时间(3小时前)
* @param pdate_src 精确时间
* @param bitmaps bitmap
*/
public NewsItemAdapter(Context context, List<String> imageUrl, List<String> imageWidth, List<String> imageHeight, List<String> title, List<String> content, List<String> newsUrl, List<String> newsSource, List<String> pdate, List<String> pdate_src, List<Bitmap> bitmaps) {
this.context = context;
this.imageUrl = imageUrl;
this.imageWidth = imageWidth;
this.imageHeight = imageHeight;
this.title = title;
this.content = content;
this.newsUrl = newsUrl;
this.newsSource = newsSource;
this.pdate = pdate;
this.pdate_src = pdate_src;
this.bitmaps = bitmaps;
layoutInflater = LayoutInflater.from(context);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = layoutInflater.inflate(R.layout.newsitem_layout, parent, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
if (title.size() != 0) {
//得到的bitmap有问题
for (int a = 0; a < MainActivity.bitmaps.size(); a++) {
Log.d("TEST", bitmaps.get(a).toString());
}
holder.imageNews.setImageBitmap(null);
holder.imageNews.setImageBitmap(bitmaps.get(0)); //根据今天晚上的调试结果来看这里不管position在不超过index 的情况下永远都是一个值
holder.textViewTitle.setText(title.get(position));
holder.textViewContext.setText(content.get(position));
holder.textViewSource.setText(newsSource.get(position) + pdate.get(position));
/* Message message = new Message();
message.what = 0;
message.obj = title.get(position);
MainActivity.handler.sendMessage(message);
Message message1 = new Message();
message.what = 1;
message.obj = content.get(position);
MainActivity.handler.sendMessage(message1);
Message message2 = new Message();
message.what = 2;
message.obj = newsSource.get(position) + pdate.get(position);
MainActivity.handler.sendMessage(message2);*/
} else {
holder.textViewTitle.setText("没有查询到相关信息");
}
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onItemClick(holder.itemView, position);
}
});
}
}
@Override
public int getItemCount() {
Log.i(TAG, "getItemCount:" + title.size());
return title.size();
}
}
class MyViewHolder extends RecyclerView.ViewHolder {
static ImageView imageNews;
static TextView textViewTitle, textViewContext, textViewSource;
public MyViewHolder(View itemView) {
super(itemView);
imageNews = (ImageView) itemView.findViewById(R.id.imageViewNewsImage);
textViewTitle = (TextView) itemView.findViewById(R.id.textViewTitle);
textViewContext = (TextView) itemView.findViewById(R.id.textViewContent);
textViewSource = (TextView) itemView.findViewById(R.id.textViewSource);
}
}
很清楚的明白将新闻的标题,正文的预览,图片,都一一通过position进行一一分发,我代码中将holder.imageNews.setImageBitmap(bitmaps.get(0));写成0,这个实在是无奈之举,否则在调试的时候就会产生下标越界,所以这个图片就不能一一进行分发了,希望大家能看看这个问题。
二、MainActivity
主要代码:
networkData = new NetworkData(getApplicationContext());
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
url_ = editKey.getText().toString();
try {
url_ = URLEncoder.encode(url_, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
networkData.getNetData(_url + url_);//对数据进行请求
}
});
newsItemAdapter = new NewsItemAdapter(getApplicationContext(), imageUrl, imageWidth, imageHeight, title, content, newsUrl, newsSource, pdate, pdate_src, bitmaps);
recyclerView.setAdapter(newsItemAdapter);
recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL_LIST));
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(linearLayoutManager);
newsItemAdapter.setOnItemListener(new NewsItemAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.i(TAG, "position " + position);
String newsPath = newsUrl.get(position);
delete();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(newsPath));
startActivity(intent);
}
});
主要是进行搜索的监听,这个的从网上勾取数据没有自己写是利用了Volley进行的,还挺方便的。在进行适配器初始化的时候,已经将各种数据已经存进了List<T>里去了,
具体的内容需要注意NetworkData.getNetData()方法里。需要着重注意一下。
三、还是看看这个NetworkData了里去看看
这里面主要是对网路数据的勾取,及将数据交给Gson进行解析的整个过程。
package com.hejingzhou.simplyapp.netData;
import android.content.Context;
import android.util.Log;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.hejingzhou.simplyapp.ContentItem.Url2Bitmap;
import com.hejingzhou.simplyapp.jsonAndBean.JsonDecode;
/**
* Created by Hejingzhou on 2016/5/28.
*/
public class NetworkData {
private String TAG = getClass().getCanonicalName();
public static RequestQueue requestQueue;
public StringRequest stringRequest;
private JsonDecode jsonDecode;
private Context context;
public NetworkData(Context context) {
this.context = context;
requestQueue = Volley.newRequestQueue(context);
}
public void getNetData(String url) {
stringRequest = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i(TAG, response);
jsonDecode = new JsonDecode();
jsonDecode.jsonDecode(response, context);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i(TAG, error.getMessage().toString());
}
});
requestQueue.add(stringRequest);
}
}<span style="color:#ff0000;">
</span>
四、JsonDecode
关于Gson的解析不懂得可以看我的另一篇博客:
http://blog.csdn.net/csdnhejingzhou/article/details/51221560
json解析咯。
还有就是将解析到的图片地址进行传递给Url2Bitmap类将url转化为bitmap集合
package com.hejingzhou.simplyapp.jsonAndBean;
import android.content.Context;
import android.util.Log;
import com.google.gson.Gson;
import com.hejingzhou.simplyapp.ContentItem.Url2Bitmap;
import com.hejingzhou.simplyapp.activity.MainActivity;
/**
* Created by Hejingzhou on 2016/5/28.
*/
public class JsonDecode {
private String TAG = getClass().getCanonicalName();
private JsonBean jsonBean;
private Gson gson;
private Url2Bitmap url2Bitmap;
private Context context;
public void jsonDecode(String strJson, Context context) {
Log.i(TAG, strJson);
jsonBean = new JsonBean();
gson = new Gson();
this.context = context;
jsonBean = gson.fromJson(strJson, JsonBean.class);
Log.i(TAG, "返回码" + jsonBean.getError_code());
Log.i(TAG, "返回说明" + jsonBean.getReason());
if (jsonBean.getError_code() == 0 && jsonBean.getReason().equals("查询成功")) {
for (int i = 0; i < jsonBean.getResult().size(); i++) {
Log.i(TAG, "i的值" + i);
MainActivity.title.add(jsonBean.getResult().get(i).getTitle());//向title列中投放数据
MainActivity.content.add(jsonBean.getResult().get(i).getContent());
MainActivity.imageWidth.add(jsonBean.getResult().get(i).getImg_width());
MainActivity.imageHeight.add(jsonBean.getResult().get(i).getimg_height());
MainActivity.imageUrl.add(jsonBean.getResult().get(i).getImg());
MainActivity.newsUrl.add(jsonBean.getResult().get(i).getUrl());
MainActivity.pdate.add(jsonBean.getResult().get(i).getPdate());
MainActivity.pdate_src.add(jsonBean.getResult().get(i).getPdate_src());
MainActivity.newsSource.add(jsonBean.getResult().get(i).getSrc());
url2Bitmap = new Url2Bitmap(context, MainActivity.imageUrl);//将图片地址转化为bitmap
}
for (int j = 0; j < jsonBean.getResult().size(); j++) {
Log.i(TAG, "******************************************************************************************************************");
Log.i(TAG, "title数组中存放的数据:" + MainActivity.title.get(j));
Log.i(TAG, "content数组中存放的数据:" + MainActivity.content.get(j));
Log.i(TAG, "imagewidth数组中存放的数据:" + MainActivity.imageWidth.get(j));
Log.i(TAG, "imageheight数组中存放的数据:" + MainActivity.imageHeight.get(j));
Log.i(TAG, "imageUrl数组中存放的数据:" + MainActivity.imageUrl.get(j));
Log.i(TAG, "newsurl数组中存放的数据:" + MainActivity.newsUrl.get(j));
Log.i(TAG, "pdate数组中存放的数据:" + MainActivity.pdate.get(j));
Log.i(TAG, "pdatesrc数组中存放的数据:" + MainActivity.pdate_src.get(j));
Log.i(TAG, "newsSource数组中存放的数据:" + MainActivity.newsSource.get(j));
}
}
}
}
五、将url转化为bitmap的类Url2Bitmap
package com.hejingzhou.simplyapp.ContentItem;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.Volley;
import com.hejingzhou.simplyapp.activity.MainActivity;
import java.util.List;
/**
* Created by Hejingzhou on 2016/5/30.
*/
public class Url2Bitmap {
private RequestQueue requestQueue;
private ImageRequest imageRequest;
private String TAG = getClass().getCanonicalName();
public Url2Bitmap(Context context, List<String> url) {
requestQueue = Volley.newRequestQueue(context);
for (int i = 0; i < url.size(); i++) {
Log.d(TAG,MainActivity.imageUrl.get(i));
//if (!MainActivity.bitmaps.contains(MainActivity.bitmaps.get(i))) {
imageRequest = new ImageRequest(MainActivity.imageUrl.get(i).toString(), new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
MainActivity.bitmaps.add(response);
Log.d(TAG, "" + response);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, error.getMessage().toString());
}
});
requestQueue.add(imageRequest);
//}
}
}
}
附加两个布局文件:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#778899"
tools:context=".activity.MainActivity">
<EditText
android:id="@+id/editTextNewKey"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:hint="键入要搜索的新闻" />
<Button
android:id="@+id/buttonSearch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/editTextNewKey"
android:text="搜索" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/buttonSearch"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
newsitem_layout_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#990033">
<ImageView
android:id="@+id/imageViewNewsImage"
android:layout_width="156dp"
android:layout_height="match_parent"
android:layout_gravity="left|top" />
<TextView
android:id="@+id/textViewTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/textViewContent"
android:layout_alignParentTop="true"
android:layout_alignRight="@+id/textViewContent"
android:layout_gravity="center_horizontal|top"
android:text="标题"
android:textColor="@color/colorAccent"
android:textSize="15dp" />
<TextView
android:id="@+id/textViewContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textViewTitle"
android:layout_gravity="center"
android:layout_toEndOf="@+id/imageViewNewsImage"
android:layout_toRightOf="@+id/imageViewNewsImage"
android:textSize="10dp"
android:text="内容简要" />
<TextView
android:id="@+id/textViewSource"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:text="报社时间"
android:textSize="7dp"
android:layout_gravity="right|bottom" />
</RelativeLayout>
运行图:
点击:
以 上 的 全 部 出 现 的 问 题
希 望 能 指 正 ,谢 谢!!!