reader(三)

主界面

  布局
     CoordinatorLayout是一个增强型的FrameLayout
    Toolbar的layout_height属性,要用“?attr/actionBarSize”而不是“?android:attr/actionBarSize”,替换后可解决NavigationIcon不垂直居中的问题。


ctionBarDrawerToggle 是 DrawerLayout.DrawerListener 实现。和 NavigationDrawer 搭配使用,推荐用这个方法,符合Android design规范。



getSupportFragmentManager().beginTransaction().replace(R.id.fl_contentmLatestFragment).commit();

public void setArguments(Bundle args)
该方法给该Fragment对象提供构建参数。它只在Fragment对象被绑定到它Activity对象之前被调用,也就是说在构建该Fragment对象之后,应该立即调用。该方法提供的参数会在Fragment对象销毁和创建期间被保留。
RecyclerView
它需要使用ViewHolder。使用时需要重写两个主要方法:一个用来展现视图和它的持有者,而另一个用来把数据绑定到视图上。这么做的好处是,第一种方法只有当我们真正需要创建一个新视图时才被调用,不需要检查它是否已经被回收。


通过Adaper传递List到RecyclerView,在Adapter中进行刷新,监听等。然后监听点击事件中跳转到一篇具体文章的内容,在这里使用到UIL框架,用Gson得到文章具体内容。在此之前的都是获得一些比较单一的信息,比如id,name,images等。

首先List的单个View。
StorySimple


public class StorySimple  implements Parcelable {

     private int  id ;
    private List<String>  images ;
    private String  title ;
    private String  multipic ;

    public void  setTitle(String title) {
         this. title = title ;
    }

     public String  getTitle() {
         return  title ;
    }

     public void  setId( int id) {
         this. id = id ;
    }

     public int  getId() {
         return  id ;
    }

     public void  setImages(List<String> images) {
         this. images = images ;
    }

     public List<String>  getImages() {
         return  images ;
    }

     public void  setMultipic(String multipic) {
         this. multipic = multipic ;
    }

     public String  getMultipic() {
         return  multipic ;
    }

     @Override
     public String  toString() {
         return  "StorySimple{" +
                 "id=" id +
                 ", images=" images +
                 ", title='" title ' \' +
                 ", multipic='" multipic ' \' +
                 '}' ;
    }



     public StorySimple(){}

     protected StorySimple(Parcel in) {
         this. id=in.readInt() ;
        this. images=in.createStringArrayList() ;
        this. title=in.readString() ;
        this. multipic=in.readString() ;
    }

     public static final Creator<StorySimple>  CREATOR new Creator<StorySimple>() {
         @Override
         public StorySimple  createFromParcel(Parcel in) {
             return new StorySimple(in) ;
        }

         @Override
         public StorySimple[]  newArray( int size) {
             return new StorySimple[size] ;
        }
    } ;

     @Override
     public int  describeContents() {
         return  0 ;
    }

     @Override
     public void  writeToParcel(Parcel dest , int flags) {
        dest.writeInt( this. id) ;
        dest.writeStringList( this. images) ;
        dest.writeString( this. title) ;
        dest.writeString( this. multipic) ;
    }

}

Parcelable ?

先实现视图的实现。
自定义ViewHolder。
public class MyRecyclerViewHolder  extends RecyclerView.ViewHolder {
     //RecyclerView必须使用viewHolder
     public TextView  tv_story_title ;
    public ImageView  img_story_image ;
    public ImageView  iv_multiPic ;

    public MyRecyclerViewHolder(View itemView) {
         super(itemView) ;
         tv_story_title = (TextView) itemView.findViewById(R.id. tv_title) ;
         img_story_image= (ImageView) itemView.findViewById(R.id. iv_image) ;
         iv_multiPic= (ImageView) itemView.findViewById(R.id. iv_multiPic) ;
    }
}

自定义Adapter继承ViewHolder.
public class RecyclerViewAdapter  extends RecyclerView.Adapter<MyRecyclerViewHolder> {

     private OnItemClickListener  mListener ;
    private Context  mContext ;
    private List<StorySimple>  mStories ;

public RecyclerViewAdapter(Context context List<StorySimple> stories){
     mContext=context ;
     mStories=stories ;

}
     @Override
     public MyRecyclerViewHolder  onCreateViewHolder(ViewGroup parent , int viewType) {
        View view= LayoutInflater. from( mContext).inflate(R.layout. card_view ,parent ,false) ;
        MyRecyclerViewHolder holder= new MyRecyclerViewHolder(view) ;
        return holder ; //这是为什么呢  应该是会执行一次,有执行顺序
}

     @Override
     public void  onBindViewHolder( final MyRecyclerViewHolder holder , final int position) {
        ZLog. d( this, mStories.get(position).getTitle()) ;

        holder. tv_story_title.setText( mStories.get(position).getTitle().toString()) ;
        if ( mStories.get(position).getImages()!= null){
             final ImageLoader imageLoader=ImageLoader. getInstance() ;
            DisplayImageOptions options= new DisplayImageOptions.Builder()
                    .cacheInMemory( true)
                    .cacheOnDisk( true)
                    .build() ;
            if ( mStories.get(position).getImages().size()== 1){
                imageLoader.displayImage( mStories.get(position).getImages().get( 0)
                 ,holder. img_story_image ,options) ;
            }
        } else {
//            holder.img_story_image.setVisibility(View.GONE);
            holder. img_story_image.setImageResource(R.drawable. readericon) ;
        }

         if (Boolean. valueOf( mStories.get(position).getMultipic())== true){
            holder. iv_multiPic.setVisibility(View. VISIBLE) ;
        } else {
            holder. iv_multiPic.setVisibility(View. GONE) ;
        }

         if ( mListener!= null){
            holder. itemView.setOnClickListener( new View.OnClickListener() {
                 @Override
                 public void  onClick(View v) {
                     mListener.onItemClick( holder. itemView , holder.getPosition()) ;
                }
            }) ;
        }


    }

     @Override
     public int  getItemCount() {
         return  mStories.size() ;
    }

     public void  addDataList(List<StorySimple> items){
         mStories.clear() ;
         mStories.addAll(items) ;
         notifyDataSetChanged() ;

    }

     public void  setOnItemClickListener(OnItemClickListener listener){
         mListener=listener ;
    }

}

自定义Fragment。其中监听事件在这里实现。
public class LatestFragment  extends Fragment  implements SwipeRefreshLayout.OnRefreshListener{

     private SwipeRefreshLayout  mSwipeRefreshLayout ;
    private RecyclerView  mRecyclerView ;
    private Boolean  mIsDataLoaded = true;
    private Latest  mLatest ;
    private RecyclerViewAdapter  mAdapter ;
    private List<StorySimple>  mStories ;
    private final String  TAG= "LatestFragment" ;
    private final int  LOAD_DATA_FAIL = 1 ;
    private final int  LOAD_DATA_SUCCESS= 2 ;

     @Nullable
    @Override
     public View  onCreateView(LayoutInflater inflater @Nullable ViewGroup container , @Nullable Bundle savedInstanceState) {

        View view=inflater.inflate(R.layout. fragment_main ,container ,false) ;
         mSwipeRefreshLayout= (SwipeRefreshLayout) view.findViewById(R.id. srfl_frag) ;
         mRecyclerView= (RecyclerView) view.findViewById(R.id. rv_frag) ;

         mSwipeRefreshLayout.setColorSchemeResources(R.color. colorPrimary
         ,R.color. green ,R.color. yellow) ;
         mRecyclerView.setAdapter( mAdapter) ;

         mAdapter.setOnItemClickListener( new OnItemClickListener() {
             @Override
             public void  onItemClick(View view , int position) {
                Intent intent= new Intent(getActivity() ,StoryDetailActivity. class) ;
                intent.putExtra( "story_simple" , mStories.get(position)) ;
                startActivity(intent) ;
                ZLog. d( this, "position id:"+ mStories.get(position).getId()) ;
            }
        }) ;
         mRecyclerView.setLayoutManager( new LinearLayoutManager(getActivity()
         ,LinearLayoutManager. VERTICAL ,false)) ;
        return view ;

    }

     @Override
     public void  onRefresh() {
        loadLatestData() ;
    }

     private void  loadLatestData() {

        MyHttpClient. httpGet(MyHttpUrl. DAILY_BASEURL + MyHttpUrl. LATEST , new Callback() {
             @Override
             public void  onFailure(Call call IOException e) {
                 mHandler.sendEmptyMessage( LOAD_DATA_FAIL) ;
            }

             @Override
             public void  onResponse(Call call Response response)  throws IOException {
                 mLatest= GsonUtils. getObject(response.body().string() ,Latest. class) ;
                 mHandler.sendEmptyMessage( LOAD_DATA_SUCCESS) ;
                System. out.println( "++++ mLatest data:"+ mLatest.toString()+ "mLatest story title"+
                         mLatest.getStories().get( 0).getTitle()) ;
            }
        }) ;
    }

     private Handler  mHandler= new Handler(){
         @Override
         public void  handleMessage(Message msg) {
             switch (msg. what){
                 case  LOAD_DATA_FAIL:

                     break;
                case  LOAD_DATA_SUCCESS:
                     mStories= mLatest.getStories() ;
                     mAdapter.addDataList( mStories) ;

                    break;
            }
             mSwipeRefreshLayout.setRefreshing( false) ;
        }
    } ;


     @Override
     public void  onAttach(Context context) {
         super.onAttach(context) ;
         mStories= new ArrayList<>() ;
         mAdapter= new RecyclerViewAdapter(getActivity() , mStories) ;
    }

     @Override
     public void  onActivityCreated( @Nullable Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState) ;
         mSwipeRefreshLayout.post( new Runnable() {
             @Override
             public void  run() {
                 mSwipeRefreshLayout.setRefreshing( true) ;
                loadLatestData() ;
            }
        }) ;
    }

     @Override
     public void  onDestroyView() {
         super.onDestroyView() ;
    }
}

public class ThemeFragment  extends Fragment  implements SwipeRefreshLayout.OnRefreshListener {

     private SwipeRefreshLayout  mSwipeRefreshLayout ;
    private RecyclerView  mRecyclerView ;
    private Boolean  mIsDataLoaded = true;
    private ThemeStories  mThemeStories ;
    private RecyclerViewAdapter  mAdapter ;
    private List<StorySimple>  Stories ;
    private final String  TAG= "ThemeFragment" ;
    private final int  LOAD_DATA_FAIL = 1 ;
    private final int  DATA_LOAD_SUCCESS= 2 ;
    private int  mThemeId ;


    private Handler  mHandler= new Handler(){
         @Override
         public void  handleMessage(Message msg) {
             switch (msg. what){
                 case  LOAD_DATA_FAIL:
                     break;
                case  DATA_LOAD_SUCCESS:
                     Stories= mThemeStories.getStories() ;
                     mAdapter.addDataList( Stories) ;
                    break;
            }
             mSwipeRefreshLayout.setRefreshing( false) ;

        }
    } ;

     @Override
     public void  onAttach(Context context) {
         super.onAttach(context) ;
         Stories= new ArrayList<>() ;
         mAdapter= new RecyclerViewAdapter(getActivity() , Stories) ;

    }

     @Override
     public void  onActivityCreated( @Nullable Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState) ;
         mSwipeRefreshLayout.post( new Runnable() {
             @Override
             public void  run() {
                 mSwipeRefreshLayout.setRefreshing( true) ;

                loadThemeData() ;

            }
        }) ;
    }





     @Nullable
    @Override
     public View  onCreateView(LayoutInflater inflater @Nullable ViewGroup container ,
                              @Nullable Bundle savedInstanceState) {
         mThemeId=getArguments().getInt( "themeId") ;

        View view=inflater.inflate(R.layout. fragment_main ,container ,false) ;

         mSwipeRefreshLayout= (SwipeRefreshLayout) view.findViewById(R.id. srfl_frag) ;

         mRecyclerView= (RecyclerView) view.findViewById(R.id. rv_frag) ;

         mSwipeRefreshLayout.setColorSchemeResources(R.color. colorPrimary
         ,R.color. green ,R.color. yellow) ;

         mSwipeRefreshLayout.setOnRefreshListener( this) ;
         mRecyclerView.setAdapter( mAdapter) ;
         mAdapter.setOnItemClickListener( new OnItemClickListener() {
             @Override
             public void  onItemClick(View view , int position) {
                Intent intent= new Intent(getActivity() ,StoryDetailActivity. class) ;
                intent.putExtra( "story_simple" , Stories.get(position)) ;
                startActivity(intent) ;
                ZLog. d( this, "position id:"+ Stories.get(position).getId()) ;
            }
        }) ;
         mRecyclerView.setLayoutManager( new LinearLayoutManager(getActivity() ,
                LinearLayoutManager. VERTICAL ,false)) ;
        return view ;


    }
     private void  loadThemeData() {

        MyHttpClient. httpGet(MyHttpUrl. Theme_BASE mThemeId , new Callback() {
             @Override
             public void  onFailure(Call call IOException e) {
                 mHandler.sendEmptyMessage( LOAD_DATA_FAIL) ;

            }

             @Override
             public void  onResponse(Call call Response response)  throws IOException {
                 mThemeStories= GsonUtils. getObject(response.body().string() ,ThemeStories. class) ;
                 mHandler.sendEmptyMessage( DATA_LOAD_SUCCESS) ;
            }
        }) ;
    }

     @Override
     public void  onDestroyView() {
         super.onDestroyView() ;
    }

     @Override
     public void  onRefresh() {
        loadThemeData() ;
    }
}

并在MainActivity中通过判定ID来决定视图的选择。
public class MainActivity  extends AppCompatActivity
         implements NavigationView.OnNavigationItemSelectedListener {

     @Bind(R.id. fab)
    FloatingActionButton  mFab ;
     @Bind(R.id. toolbar)
    Toolbar  mToolbar ;
     @Bind(R.id. nav_view)
    NavigationView  mNavigationView ;
     @Bind(R.id. drawer_layout)
    DrawerLayout  mDrawerLayout ;


    private LatestFragment  mLatestFragment ;
    private ThemeFragment  mThemeFragment ;
    private long  lastTime ;

     @Override
     protected void  onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState) ;
        setContentView(R.layout. activity_main) ;
        ButterKnife. bind( this) ;
        initView() ;
    }

     private void  initView() {
        setSupportActionBar( mToolbar) ;
         mFab.setOnClickListener( new View.OnClickListener() {
             @Override
             public void  onClick(View v) {
                Utils. ToastMsg(MainActivity. this, "Test" Toast. LENGTH_SHORT) ;
            }
        }) ;
        ActionBarDrawerToggle toggle= new ActionBarDrawerToggle( this, mDrawerLayout , mToolbar ,
                R.string. navigation_drawer_open ,R.string. navigation_drawer_close) ;
        toggle.syncState() ; //?????
         mDrawerLayout.setDrawerListener(toggle) ;
         mNavigationView.setNavigationItemSelectedListener( this) ;
         mNavigationView.setCheckedItem(R.id. nav_home) ;


         mLatestFragment= new LatestFragment() ;
        getSupportFragmentManager().beginTransaction().replace(
                R.id. fl_content mLatestFragment).commit() ;

    }

     @Override
     public boolean  onOptionsItemSelected(MenuItem item) {
         int id = item.getItemId() ;
        switch (id) {
             case R.id. action_settings:
                Intent intent= new Intent(MainActivity. this,LoginActivity. class) ;
//                intent.putExtra("email",)

                startActivity(intent) ;
                onDestroy() ;
                break;
            case R.id. action_search:
                 break;
            default:
                 break;
        }
         return super.onOptionsItemSelected(item) ;
    }

     @Override
     public boolean  onNavigationItemSelected(MenuItem item) {
        item.setChecked( true) ;
        selectNavItem(item.getItemId()) ;
         mDrawerLayout.closeDrawers() ;
        return true;
    }

     @Override
     public void  onBackPressed() {
         if ( mDrawerLayout.isDrawerOpen(Gravity. LEFT)){
             mDrawerLayout.closeDrawers() ;
        } else {
             long currentTime=System. currentTimeMillis() ;
            if (currentTime- lastTime> 2000){
                Snackbar. make( mFab , "再按一次退出" ,Snackbar. LENGTH_SHORT)
                        .setAction( "退出" , new View.OnClickListener() {
                             @Override
                             public void  onClick(View v) {
                                finish() ;
                            }
                        }).show() ;
                 lastTime=currentTime ;
            } else {
                finish() ;
            }
        }
    }
     @Override
     public boolean  onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu. toolbar_menu menu) ;
        return true;
    }

     private void  selectNavItem( int id) {
         switch (id){
             case R.id. nav_home:
                getSupportFragmentManager().beginTransaction().replace(
                        R.id. fl_content mLatestFragment).commit() ;
                break;
            default:
                 mThemeFragment= new ThemeFragment() ;
                Bundle bundle= new Bundle() ;
                bundle.putInt( "themeId" ,getThemeId(id)) ;

                 mThemeFragment.setArguments(bundle) ;

                getSupportFragmentManager().beginTransaction()
                        .replace(R.id. fl_content , mThemeFragment).commit() ;

                break;


        }
    }
     public int  getThemeId( int id) {
         int themeId=- 1 ;
        switch (id){
             case R.id. nav_psychology:
                themeId= 13 ;
                break;
            case R.id. nav_user_recommended:
                themeId= 12 ;
                break;
            case R.id. nav_movie:
                themeId= 3 ;
                break;
            case R.id. nav_not_allowed_bored:
                themeId= 11 ;
                break;
            case R.id. nav_design:
                themeId= 4 ;
                break;
            case R.id. nav_big_company:
                themeId= 5 ;
                break;
            case R.id. nav_economic:
                themeId= 6 ;
                break;
            case R.id. nav_internet_safety:
                themeId= 10 ;
                break;
            case R.id. nav_start_games:
                themeId= 2 ;
                break;
            case R.id. nav_music:
                themeId= 7 ;
                break;
            case R.id. nav_cartoon:
                themeId= 9 ;
                break;
            case R.id. nav_sports:
                themeId= 8 ;
                break;
        }
         return themeId ;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值