新闻搜索浏览
来源:互联网 发布:windows程序设计教材 编辑:程序博客网 时间:2024/05/29 19:40
大前天星期六,正好有两天的时间,把这几天学的学习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>运行图: 点击:
源码: http://download.csdn.net/detail/csdnhejingzhou/9536429
以 上 的 全 部 出 现 的 问 题
希 望 能 指 正 ,谢 谢!!!
源码: http://download.csdn.net/detail/csdnhejingzhou/9536429
0 0
- 新闻搜索浏览
- 用户浏览新闻分析
- 仿新闻图片浏览
- Material Design--新闻浏览APP
- 练手项目—新闻浏览
- Android实现新闻浏览功能
- 仿腾讯图片新闻浏览效果
- (十)-实现新闻详细信息浏览页面
- android 新闻浏览客户端+PHP后台
- 搜索+浏览合二为一的Slikk
- 纳讯新闻搜索系统
- 搜索行业的相关新闻
- 用JAVA实现新闻搜索
- Elasticsearch整合Mysql新闻搜索
- 新闻阅读应用Hitpad新增Facebook浏览功能
- S2SH下文章新闻等浏览次数的计算
- 用gallery+framelayout做新闻首页图片浏览效果
- webview显示html代码(可用于新闻浏览界面)
- Maven学习总结(17)——深入理解maven灵活的构建
- Redis系列-安装部署维护篇
- Android bitmap bytearray转换
- android studio导入第三方jar
- mysql修改密码后,phpMyadmin无法登陆
- 新闻搜索浏览
- android studio报错Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled解决方案
- 专题一 贪心算法总结
- iOS新特性扩展之Today分享(2)
- 你编程入门了吗
- 【整理】html知识点
- Android 获取屏幕显示信息
- 服务器架构演变之路学习
- Android 获取memoryinfo