Andorid 獲取數據并填充到View

Andorid 獲取數據并填充到View

背景

在上次的博客中,進行了登錄請求的實現,實現了客戶端與服務端的交互并向服務端提交數據。這次就想著從服務端獲取數據,并將數據展示在頁面中。

構思

根據自己工作中遇到的的接口,很多都返回一個list。就想試著寫一個頁面來承載這些數據。根據看《Android第一行代碼》看到RecycleView能夠滿足改需求。所以決定在上一次的代碼基礎上再加一個activity。

操作

  1. 查看數據返回構造響應的數據結構。因為在開發代碼中已經有了對應的代碼,所以我就直接進行了拷貝,省去寫代碼的時間。
  2. 編寫布局文件,
  • 整個布局文件activity_my_article.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent" android:layout_height="match_parent">
   <!--android:background="0x7f0801a2">-->
   <android.support.design.widget.AppBarLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
       <android.support.v7.widget.Toolbar
           android:id="@+id/toolbar"
           android:layout_width="match_parent"
           android:layout_height="?attr/actionBarSize"
           android:background="?attr/colorPrimary"
           app:layout_scrollFlags="scroll|exitUntilCollapsed"/>
   </android.support.design.widget.AppBarLayout>
   <android.support.v7.widget.RecyclerView
       android:id="@+id/recycler_view"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>

主要用到的布局控件:RecyclerView、Toolbar、CoordinatorLayout、AppBarLayout。Toolbar、CoordinatorLayout、AppBarLayout的介紹的文章,這里給出一篇介紹。關于RecyclerView的介紹網上資料也是比較多的,這里就不給了。

  • 各個item布局 item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:id="@+id/item_layout">

 <TextView
     android:lineSpacingExtra="0dp"
     android:textSize="20sp"
     android:ellipsize="end"
     android:layout_margin="20dp"
     android:layout_height="wrap_content"
     tools:text="文章標題文章標題文章標題文章標題文章標題"
     android:includeFontPadding="false"
     android:lineSpacingMultiplier="1.2"
     android:gravity="top"
     android:layout_width="match_parent"
     android:id="@+id/my_article_item_title_txt"
     android:maxLines="2"
     android:textColor="#333333"
     >
 </TextView>
</LinearLayout>

這里的布局很簡單主要就為了顯示一個文本。設置了標題的大小間距等信息。

  • 因為用到webview所以新增一個activity_web_view.xml文件。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_height="match_parent"
 android:layout_width="match_parent">

 <WebView
     android:id="@+id/webView1"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     />
</RelativeLayout>

以上就是我們編寫的布局。在以上用的一些:toolbar 、Recycleview、CoordinatorLayout、AppBarLayout都不是自有的,而是需要加入依賴。在模塊buile.gradle中加入以下依賴:

  compile 'com.android.support:recyclerview-v7:26.1.0'
    compile 'com.android.support:design:26.1.0' 

因為我們設置了toolbar,所以不要再用自帶的。所以在res/valus/stytles.xml中加入一個noActionbar的stytle.

 <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
    </style>

應用這個styele到我們對應的activity中
xml <activity android:name=".MyArticleActivity" android:theme="@style/AppTheme.NoActionBar"> </activity>

  1. 編寫適配器。代碼如下
package LoginCore;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;


import com.weidian.login.R;
import com.weidian.login.WebViewActivity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * Created by huxy on 2018/3/26.
 */

public class MyArticleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<QueryArticleResponse.ArticleInfo> articleData;
    private Context context;

    public MyArticleAdapter(Context context,List<QueryArticleResponse.ArticleInfo> articleData) {
        this.context = context;
        this.articleData=articleData;
    }
    private Context getContext(){
        return context;
    }

    public List<QueryArticleResponse.ArticleInfo> getData() {
        return articleData;
    }

    public void setData(QueryArticleResponse data) {
        if (articleData == null) {
            articleData = new ArrayList<>();
        }
        articleData.clear();
        articleData.addAll(data.items);
        notifyDataSetChanged();
    }

    public void appendData(QueryArticleResponse data) {
        articleData.addAll(data.items);
        notifyDataSetChanged();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        return new MyArticleAdapter.MyArticleViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false));
    }

    @Override
    public int getItemCount() {
        return articleData == null ? 0 : articleData.size();
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        bindItem((MyArticleViewHolder) holder, position);
        //設置點擊事件
        ((MyArticleViewHolder) holder).itemLayout.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context, WebViewActivity.class);
                ((MyArticleViewHolder) holder).itemLayout.getContext().startActivity(intent);
            }

        });

    }

    private void bindItem(final MyArticleViewHolder holder, int position) {
        if (articleData != null && articleData.size() > position) {

            if (articleData != null && articleData.size() > position) {
                final QueryArticleResponse.ArticleInfo data = articleData.get(position);
                //設置title
                holder.itemTitleTxt.setText(data.title);
                holder.itemTitleTxt.setMaxLines(TextUtils.isEmpty(data.getCover()) ? 1 : 2);
            }
        }
    }
    public class MyArticleViewHolder extends RecyclerView.ViewHolder {
        public LinearLayout itemLayout;
        public TextView itemTitleTxt;

        private MyArticleViewHolder(final View v) {
            super(v);
            itemTitleTxt = (TextView) v.findViewById(R.id.my_article_item_title_txt);
            itemLayout = (LinearLayout) v.findViewById(R.id.item_layout);

        }
    }
}

關于Recycleview適配器的資料,這里給出一個鏈接RecyclerView.Adapter.這個是比較詳細的,當然我們可以看一個更簡單的簡單Adapter。

  1. 編寫activity
  • 主要activity

public class MyArticleActivity extends AppCompatActivity {
   private MyArticleAdapter adapter = new MyArticleAdapter(this, null);
   private RecyclerView myArticleList;
   private int allArticleNum = 0;
   List<QueryArticleResponse.ArticleInfo> articlelist;
   PageRequest pageRequest = new PageRequest();
   ContextParam contextParam = new ContextParam();
   Handler uiHandler = new Handler(Looper.getMainLooper());

   private Toolbar toolbar;

   public interface ResponseListner {
       void RespondeSuccess(QueryArticleResponse result);
   }

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_my_article);

       toolbar = findViewById(R.id.toolbar);
       toolbar.setTitle("所有文章");
       //獲得recycleview
       RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
       //初始化數據
       try {
           initdata(new ResponseListner() {
               @Override
               public void RespondeSuccess(final QueryArticleResponse result) {
                   uiHandler.post(new Runnable() {
                       @Override
                       public void run() {
                           adapter.setData(result);
                       }
                   });
               }
           });
       } catch (Exception e) {
           e.printStackTrace();
       }

       //數據進入適配器
      recyclerView.setLayoutManager(new LinearLayoutManager(this));
       //適配器與recyclerview綁定
       recyclerView.setAdapter(adapter);
       //設置分割線
       recyclerView.addItemDecoration(new MyItemDecoration(this));
   }

   public void initdata(final ResponseListner responseListner) throws Exception {
       pageRequest.setPageNumber(1);
       pageRequest.setPageSize(20);
       contextParam.appid = "XXXXX";
       contextParam.userID = "XXXX";
       contextParam.token = "_EwWqqVIQLLhIfAVLURTbiJEqVXo215LK_ERPbGbh7TxuaSdIl75oZXtT1u_roWxJTN2ph0RB1mTFwIQt5FKcE6tVF5P5rQrlbtUZjNLMFYl8jrBGIp4zWqMUOasXvXLxSHdETBdQfUwg9XdDZGccNQPwuvlBSJ8AzoOwIupwtk-OBvogN7I";
       contextParam.wduss = "_EwWqqVIQLLhIfAVLURTbiJEqVXo215LK_ERPbGbh7TxuaSdIl75oZXtT1u_roWxJTN2ph0RB1mTFwIQt5FKcE6tVF5P5rQrlbtUZjNLMFYl8jrBGIp4zWqMUOasXvXLxSHdETBdQfUwg9XdDZGccNQPwuvlBSJ8AzoOwIupwtk-OBvogN7I";
       contextParam.uss = "_EwWqqVIQLLhIfAVLURTbiJEqVXo215LK_ERPbGbh7TxuaSdIl75oZXtT1u_roWxJTN2ph0RB1mTFwIQt5FKcE6tVF5P5rQrlbtUZjNLMFYl8jrBGIp4zWqMUOasXvXLxSHdETBdQfUwg9XdDZGccNQPwuvlBSJ8AzoOwIupwtk-OBvogN7I";
       contextParam.wduserID = "XXXX";

       final QueryArticleResponse[] response = new QueryArticleResponse[1];
       //發出請求
       try {
           HttpUtils.CheckResponse(pageRequest, contextParam, "需要填入url", new HttpUtils.OnRespondeSuccessListener() {
               @Override
               public void RespondeSuccess(JSONObject result) {
                   String result1 = result.getString("result");
                   //結果進行轉換
                   response[0] = JSON.parseObject(result1, QueryArticleResponse.class);
                   responseListner.RespondeSuccess(response[0]);
               }

           });

       } catch (IOException e) {
           e.printStackTrace();
           Log.e("請求異常", "not bussiness erro");
       }
   }

以上就是將適配器與Recycleview的綁定。數據來源于我們接口的請求。

- 編寫webview的activity
我們寫webbiew是針對于每一個item,都做了一個監聽,只要點擊item,webview.loadurl("http://wwww.baidu.com")

```java
public class WebViewActivity extends AppCompatActivity {

   private WebView webView;

   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_web_view);
       webView = (WebView) findViewById(R.id.webView1);
       webView.setWebViewClient(new WebViewClient());
       webView.setWebChromeClient(new WebChromeClient());
       webView.getSettings().setJavaScriptEnabled(true);
       webView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

       webView.loadUrl("http://www.baidu.com");


   }

關于MyArticleActivity的工作已經全部做完?,F在兩個activity之間還未連通。所以下面需要打通activity

  1. loginactivity 與MyArticleActivity打通
    顯性的使用Intent來進行跳轉,代碼如下:
private void postOnUIThread(final Map<String, String> result) {
        et_username.post(new Runnable() {
            @Override
            public void run() {
                if(Integer.parseInt(result.get("code"))==0){
                    Intent intent = new Intent(LoginActivity.this,MyArticleActivity.class);
                    //跳轉到下一個activity
                    startActivity(intent);


                }
                else {
                    Toast.makeText(getApplicationContext(),result.get("description"),Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

登錄成功后就跳轉到MyArticleActivity。

編譯成功運行

點擊登錄,登錄成功后跳轉到MyArticleActivity


MyArticleActivity.jpeg

點擊item項就跳轉到百度


WebViewLoadUrl.jpeg
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容