新闻搜索浏览

大前天星期六,正好有两天的时间,把这几天学的学习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>
运行图:  点击:
                      



以 上 的 全 部 出 现 的 问 题

希 望 能 指 正 ,谢 谢!!!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值