1.singleLine0的知乎日報學習:功能實現(xiàn)

1. 參考資料

NOspy的http://www.itdecent.cn/p/333f7feeb842

Screenshot_20181106-221940.jpg

2. 主界面結(jié)構(gòu)

image.png
  • 標題欄
  • Banner
  • RecycleView

3. 標題欄實現(xiàn)

ToolBar的使用

  • AppBarLayout使用:手動添加implementation'com.android.support:design:27.1.1'
    在ToolBar外面包裹AppBarLayout。

4. RecycleView實現(xiàn)

  • ItemView


    image.png
  • 重寫 RecyclerView.Adapter
    private List<NewsInfo.StoryBean> mStoryList;
    private Context mContext;
    private OnItemClickListner mOnItemClickListner;
    //傳入?yún)?shù):list和context
    public StoryAdapter(List<NewsInfo.StoryBean> storyList,Context context) {...}
    @NonNull
    @Override
    //繪制Item_view.xml得到View,并傳遞給ViewHolder
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {...}

    @Override
    //通過position獲得數(shù)據(jù)對象,并將數(shù)據(jù)加載到ViewHolder持有的View中
    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {...}

    @Override
    public int getItemCount() {...}
    //ViewHolder用來持有View中的子控件,避免每次執(zhí)行findViewById()
    static class ViewHolder extends RecyclerView.ViewHolder {
        ImageView mImageView;
        TextView mTextView;
        public ViewHolder(View itemView) {
            super(itemView);
            mImageView = itemView.findViewById(R.id.story_image);
            mTextView = itemView.findViewById(R.id.story_title);
        }
    }

5. Banner使用

https://github.com/youth5201314/banner

  • 重寫GlideImageLoader
     public class GlideImageLoader extends ImageLoader {
           @Override
           public void displayImage(Context context, Object path, ImageView imageView) {
               Glide.with(context).load(path).into(imageView);
           }
     }
  • 在activity中new,set,start
     mBanner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE)
                .setImageLoader(new GlideImageLoader())
                .setImages(imageUrls)
                .setBannerTitles(titles); //banner樣式有title才能顯示
     mBanner.start();

6. 點擊跳轉(zhuǎn)到具體的story

  • RecyclerView點擊事件
    //在mAdapter中寫一個有點擊方法的內(nèi)部接口。
    public interface OnItemClickListner {
        void onItemClick(View view,int position);
    } 
    //通過一個方法添加接口對象
    private OnItemClickListner mOnItemClickListner;
    public void setOnItemClickListner(OnItemClickListner onItemClickListner) {
        mOnItemClickListner = onItemClickListner;
    }
    //在onBindViewHolder()中實現(xiàn)Item_view中控件的點擊事件,在OnClick()方法中調(diào)用接口的方法
    holder.mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = holder.getLayoutPosition();
                mOnItemClickListner.onItemClick(holder.mTextView,position);
            }
        });
  • 獲取Story數(shù)據(jù)
    學著BiliBili客戶端封裝了NetUtil,只要是OKhttp的單例模式實現(xiàn),和Retrofit的配置
public class RetrofitHelper {

    private static OkHttpClient mOkHttpClient;
    
    static { initOkhttpClient(); }

    private static void initOkhttpClient() {
        if(mOkHttpClient == null) {
            synchronized (RetrofitHelper.class) {
                if(mOkHttpClient == null) {
                    mOkHttpClient = new OkHttpClient.Builder()
                            .connectTimeout(5, TimeUnit.SECONDS)
                            .build();       
    ...}

    public static <T>T createApi(Class<T> T) {
        Retrofit retrofit = new Retrofit.Builder()
                .client(mOkHttpClient)
                .baseUrl("http://news-at.zhihu.com/api/4/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        return retrofit.create(T);
    }
}

7.StoryLayout結(jié)構(gòu)

  • 這里偷懶直接用了demo的布局,但是toolbar沒寫好,先空著


    image.png

8.Story數(shù)據(jù)的顯示

Webview加載js代碼:

  • String2xml工具類,這里有很多String的處理,先copy了...


    image.png

9.效果圖

image.png

image.png

10. UI方面的問題

1. ItemView 用CardView做父布局,控件的邊距,做好看點
2. 上滑過程中標題欄和Banner也不會跟著滑動
3. 上滑加載過去的新聞也沒做
4. 新聞標題欄的收藏評論分享功能
5. DrawerLayout布局做好看點
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容