日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

知乎日报客户端--知乎日报板块的实现

發布時間:2024/1/1 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 知乎日报客户端--知乎日报板块的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看完這一篇你應該學會:如何展示新聞資訊類,效果圖:


上一篇講的是 :知乎日報客戶端--側滑欄的實現

這一篇的知識點: Fragment的替換,Recylerview[adapter, holder]的使用,Okhttp,JSONObject解析json

還是先給布局:

zhihufragment.xml


RecylerView的item布局: zhihu_list_item.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tool="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:orientation="horizontal"android:padding="5dp"android:layout_width="match_parent"android:layout_height="100dp"><ImageViewandroid:layout_width="120dp"android:id="@+id/zhihu_img"android:scaleType="centerCrop"android:padding="10dp"android:layout_height="match_parent" /><LinearLayoutandroid:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:textSize="20sp"tools:text="wuiweqiyweuqiewwqwqwqew"android:id="@+id/zhihu_title"android:layout_weight="1"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"tools:text="知乎客戶端"android:id="@+id/zhihu_from"/></LinearLayout> </LinearLayout>

由一個ImageView和兩個TextView構成,ImageView用來顯示知乎日報的圖片,textview來顯示標題和id。

接著是ZhihuFragment.java用來顯示zhihu_fragment.xml的,并且在這個里面完成界面的初始化顯示信息等:

public class ZhihuFragment extends Fragment {private Bitmap mBitmap;private List<News> mNews;private RecyclerView mRecyclerView;private ZhihuAdapter mAdapter;private boolean isGettingPre = false;private ProgressDialog mDialog;public static Fragment newInstance() {return new ZhihuFragment();}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mDialog = new ProgressDialog(getActivity());mDialog.setTitle("加載中");mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);mDialog.setCancelable(false);Log.d("ZhihuFragmwnt","onCreate()");if(!CheckNetWork.checkNet(getActivity())){Toast.makeText(getActivity(),"網絡連接失敗...",Toast.LENGTH_SHORT).show();}mDialog.show();mAdapter = new ZhihuAdapter();final AsyncTask newsTask = new AsyncTask() {@Overrideprotected List<News> doInBackground(Object[] objects) {mNews = Connect.getLatestNews(getActivity(),Connect.LATEST_URI);return mNews;}@Overrideprotected void onPostExecute(Object o) {super.onPostExecute(o);mRecyclerView.setAdapter(mAdapter);mDialog.dismiss();Log.d("mNews length===>", ""+mNews.size());}};// newsTask.execute();new Timer().schedule(new TimerTask() {@Overridepublic void run() {Log.d("ZhihuFragment","計時器在執行===");if(CheckNetWork.checkNet(getActivity())){newsTask.execute();this.cancel();}}},0,1000);}@RequiresApi(api = Build.VERSION_CODES.M)@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {Log.d("ZhihuFragment","onCreateView()");View v = inflater.inflate(R.layout.zhihufragment, container, false);mRecyclerView = v.findViewById(R.id.recyler_view);final LinearLayoutManager manager = new LinearLayoutManager(getActivity());mRecyclerView.setLayoutManager(manager);BitmapFactory.Options options = new BitmapFactory.Options();mBitmap = CalculateInSampleSize.decodeSampleBitmapFromRes(getResources(),R.drawable.g,240,200);mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL));mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);if(isGettingPre){return;}Log.d("item的長度",""+ manager.getItemCount()+"\n 當前itemindex: " + manager.findLastVisibleItemPosition());if(manager.getItemCount() -manager.findLastVisibleItemPosition() < 2){isGettingPre = true;mDialog.show();Log.d("Zhihu","只剩下4個item了");AsyncTask task = new AsyncTask() {@Overrideprotected List<News> doInBackground(Object[] objects) {mNews = Connect.getPreNews();//mAdapter.notifyDataSetChanged()return mNews;}@Overrideprotected void onPostExecute(Object o) {super.onPostExecute(o);Log.d("重新加載mnews==:",""+mNews.size());Log.d("count===> " ,""+manager.getItemCount()+"當前item下標===> " +manager.findLastVisibleItemPosition());mAdapter.notifyDataSetChanged();isGettingPre = false;mDialog.dismiss();}};task.execute();}}});return v;}private class ZhihuAdapter extends RecyclerView.Adapter<ZhihuAdapter.ViewHolder> {@Overridepublic ZhihuAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View v = LayoutInflater.from(getActivity()).inflate(R.layout.zhihu_list_item, parent, false);ViewHolder vh = new ViewHolder(v);return vh;}@Overridepublic void onBindViewHolder(ViewHolder holder, final int position) {holder.mImageView.setImageBitmap(mNews.get(position).getBitmap());holder.mTitle.setText(mNews.get(position).getTitle());holder.mFrom.setText(mNews.get(position).getId());holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//Toast.makeText(getActivity(),"點擊了recylerview",Toast.LENGTH_SHORT).show();// News n = Connect.newsDetail(mNews.get(position));AsyncTask task = new AsyncTask() {@Overrideprotected String doInBackground(Object[] objects) {String data = Connect.newsDetail(mNews.get(position));return data;}@Overrideprotected void onPostExecute(Object o) {super.onPostExecute(o);Intent intent = new Intent(getActivity(), NewsInfoActivity.class);intent.putExtra("data",String.valueOf(o));startActivity(intent);}};task.execute();}});}@Overridepublic int getItemCount() {return mNews.size();}public class ViewHolder extends RecyclerView.ViewHolder {public ImageView mImageView;private TextView mTitle;private TextView mFrom;public ViewHolder(View itemView) {//super();super(itemView);mImageView = itemView.findViewById(R.id.zhihu_img);mTitle = itemView.findViewById(R.id.zhihu_title);mFrom = itemView.findViewById(R.id.zhihu_from); // itemView.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // Toast.makeText(getActivity(),"點擊了recylerview",Toast.LENGTH_SHORT).show(); // Intent intent = new Intent(getActivity(), NewsInfoActivity.class); // startActivity(intent); // // } // });}}} }下面會分幾個部分來講這個代碼:

1. onCreate方法

打開時,顯示一個dialog加載中,因為程序要從網絡上獲取數據,因為Android不允許在主線程中進行任何網絡操作,所以這里使用的時AsyncTask異步進行獲取,等到獲取到數據后,就讓dialog消失。

2. onCreateView方法

這個里面先inflate我的zhihufragment.xml布局,并且設置LayoutManager,還對onScroll方法進行偵聽。

我是讓當數據中只剩下4條結果未顯示時就去自動拉去數據。用layoutmanager獲取itemcount總數,和當前最后顯示的下標位置lastitemposition,所以當itemcount - lastitemposition<5時便去獲取數據,然后解析返回的json字符串,包裝成news類后,再通知recylerview數據的改變,就實現下拉時會一直獲取數據。

3.構建Adapter和holder

private class ZhihuAdapter extends RecyclerView.Adapter<ZhihuAdapter.ViewHolder> {@Overridepublic ZhihuAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View v = LayoutInflater.from(getActivity()).inflate(R.layout.zhihu_list_item, parent, false);ViewHolder vh = new ViewHolder(v);return vh;}@Overridepublic void onBindViewHolder(ViewHolder holder, final int position) {holder.mImageView.setImageBitmap(mNews.get(position).getBitmap());holder.mTitle.setText(mNews.get(position).getTitle());holder.mFrom.setText(mNews.get(position).getId());holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//Toast.makeText(getActivity(),"點擊了recylerview",Toast.LENGTH_SHORT).show();// News n = Connect.newsDetail(mNews.get(position));AsyncTask task = new AsyncTask() {@Overrideprotected String doInBackground(Object[] objects) {String data = Connect.newsDetail(mNews.get(position));return data;}@Overrideprotected void onPostExecute(Object o) {super.onPostExecute(o);Intent intent = new Intent(getActivity(), NewsInfoActivity.class);intent.putExtra("data",String.valueOf(o));startActivity(intent);}};task.execute();}});}@Overridepublic int getItemCount() {return mNews.size();}public class ViewHolder extends RecyclerView.ViewHolder {public ImageView mImageView;private TextView mTitle;private TextView mFrom;public ViewHolder(View itemView) {//super();super(itemView);mImageView = itemView.findViewById(R.id.zhihu_img);mTitle = itemView.findViewById(R.id.zhihu_title);mFrom = itemView.findViewById(R.id.zhihu_from); // itemView.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // Toast.makeText(getActivity(),"點擊了recylerview",Toast.LENGTH_SHORT).show(); // Intent intent = new Intent(getActivity(), NewsInfoActivity.class); // startActivity(intent); // // } // });}}}創建內部類ZhihuAdapter繼承Recylerview.Adapter

onCreateViewHolder用來加載并返回item條目

onBindViewHolder顯示item的具體內容,并為itemView設置點擊偵聽,當點擊打開新聞詳情頁

getItemCount返回item的長度

新聞詳情頁是 打開另一個activity,這個activity會顯示一個WebView,里面加載html文件。

看一下獲取數據部分:

public static List<News> getLatestNews(Context context,String url) {OkHttpClient client = new OkHttpClient(); //創建okHttp對象Request request = new Request.Builder() //創建request對象.url(url).build();try {Response response = client.newCall(request).execute();//得到Response對對象//response.if (response.isSuccessful()) {String result = response.body().string();JSONObject resultObj = new JSONObject(result);latestNews_date = resultObj.getString("date");Log.d(TAG,"latest date is==> " + latestNews_date );JSONArray storiesArr = resultObj.getJSONArray("stories");Log.d(TAG,"有"+storiesArr.length()+"個故事");JSONObject firstStory = new JSONObject(storiesArr.get(0).toString());Log.d("latest_remote_id===>",firstStory.getString("id"));Log.d("pre_news_id=>",SharePres.getLatestNewsId(context));if(firstStory.getString("id").equals(SharePres.getLatestNewsId(context))){if(mNews.size() > 0){return mNews;}}mNews.clear();SharePres.setLatestNewsId(context,firstStory.getString("id"));for(int i=0;i<storiesArr.length();i++){Log.d(TAG,"mNEws.size()===> " + mNews.size());JSONObject stotyObj = new JSONObject( storiesArr.get(i).toString());String id = stotyObj.getString("id");String imgUrl = (String) stotyObj.getJSONArray("images").get(0);String title = stotyObj.getString("title");//Log.d(TAG,"img====> " + img + "\n id===> " + id + "\n title==> "+title);Bitmap bitmap=getUrlBitmap(imgUrl);News news = new News(id,title,bitmap);mNews.add(news);}return mNews;}} catch (IOException e) {Log.d(TAG, "連接失敗", e);e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}return null;}使用okhttp,然后獲得返回內容應該用? response.body().string();
jsonobject解析放在list集合返回,通知recylerview數據發生改變。

獲得從url獲得bitmap方法:

private static Bitmap getUrlBitmap(String imgUrl){Log.d("getBitmap===>", imgUrl);OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(imgUrl).build();try {Response response = client.newCall(request).execute();if(response.isSuccessful()){Bitmap bitmap = BitmapFactory.decodeStream(response.body().byteStream());return bitmap;}} catch (IOException e) {e.printStackTrace();}return null;}嗯。。


總結

以上是生活随笔為你收集整理的知乎日报客户端--知乎日报板块的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。