/*
* Copyright 2017 lizhaotailang
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.marktony.zhihudaily.homepage;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.marktony.zhihudaily.R;
import com.marktony.zhihudaily.adapter.DoubanMomentAdapter;
import com.marktony.zhihudaily.bean.DoubanMomentNews;
import com.marktony.zhihudaily.interfaze.OnRecyclerViewOnClickListener;
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
import java.util.ArrayList;
import java.util.Calendar;
/**
* Created by Lizhaotailang on 2016/8/11.
*/
public class DoubanMomentFragment extends Fragment
implements DoubanMomentContract.View {
private RecyclerView recyclerView;
private SwipeRefreshLayout refreshLayout;
private FloatingActionButton fab;
private DoubanMomentAdapter adapter;
private DoubanMomentContract.Presenter presenter;
private int mYear = Calendar.getInstance().get(Calendar.YEAR);
private int mMonth = Calendar.getInstance().get(Calendar.MONTH);
private int mDay = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
// requires an empty constructor
public DoubanMomentFragment() {}
public static DoubanMomentFragment newInstance() {
return new DoubanMomentFragment();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list, container, false);
initViews(view);
presenter.start();
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
presenter.loadPosts(Calendar.getInstance().getTimeInMillis(), true);
}
});
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
boolean isSlidingToLast = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
// 当不滚动时
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// 获取最后一个完全显示的itemposition
int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
int totalItemCount = manager.getItemCount();
// 判断是否滚动到底部并且是向下滑动
if (lastVisibleItem == (totalItemCount - 1) && isSlidingToLast) {
Calendar c = Calendar.getInstance();
c.set(mYear, mMonth, --mDay);
presenter.loadMore(c.getTimeInMillis());
}
}
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
isSlidingToLast = dy > 0;
// 隐藏或者显示fab
if(dy > 0) {
fab.hide();
} else {
fab.show();
}
}
});
return view;
}
@Override
public void setPresenter(DoubanMomentContract.Presenter presenter) {
if (presenter != null) {
this.presenter = presenter;
}
}
@Override
public void initViews(View view) {
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
fab = (FloatingActionButton) getActivity().findViewById(R.id.fab);
fab.setRippleColor(getResources().getColor(R.color.colorPrimaryDark));
refreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refreshLayout);
//设置下拉刷新的按钮的颜色
refreshLayout.setColorSchemeResources(R.color.colorPrimary);
}
@Override
public void startLoading() {
refreshLayout.setRefreshing(true);
}
@Override
public void stopLoading() {
refreshLayout.setRefreshing(false);
}
@Override
public void showLoadingError() {
Snackbar.make(fab, R.string.loaded_failed,Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.retry, new View.OnClickListener() {
@Override
public void onClick(View v) {
presenter.refresh();
}
})
.show();
}
@Override
public void showResults(ArrayList<DoubanMomentNews.posts> list) {
if (adapter == null) {
adapter = new DoubanMomentAdapter(getContext(), list);
adapter.setItemClickListener(new OnRecyclerViewOnClickListener() {
@Override
public void OnItemClick(View v, int position) {
presenter.startReading(position);
}
});
recyclerView.setAdapter(adapter);
} else {
adapter.notifyDataSetChanged();
}
}
public void showPickDialog() {
Calendar now = Calendar.getInstance();
now.set(mYear, mMonth, mDay);
DatePickerDialog dialog = DatePickerDialog.newInstance(new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
Calendar temp = Calendar.getInstance();
temp.clear();
temp.set(year, monthOfYear, dayOfMonth);
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
presenter.loadPosts(temp.getTimeInMillis(), true);
}
}, now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH));
dialog.setMaxDate(Calendar.getInstance());
Calendar minDate = Calendar.getInstance();
minDate.set(2014, 5, 12);
dialog.setMinDate(minDate);
// set the dialog not vibrate when date change, default value is true
dialog.vibrate(false);
dialog.show(getActivity().getFragmentManager(), "DatePickerDialog");
}
}