新闻搜索浏览

来源:互联网 发布: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