package com.github.clans.fab.sample; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.ActionBarActivity; 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 android.widget.TextView; import com.github.clans.fab.FloatingActionButton; import com.github.fab.sample.R; import java.util.LinkedList; import java.util.Locale; /** * A very basic example of using FloatingActionButton with RecyclerView */ public class RecyclerViewActivity extends ActionBarActivity { private int mScrollOffset = 4; private int mMaxProgress = 100; private LinkedList<ProgressType> mProgressTypes; private Handler mUiHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.recyclerview_activity); Locale[] availableLocales = Locale.getAvailableLocales(); mProgressTypes = new LinkedList<>(); for (ProgressType type : ProgressType.values()) { mProgressTypes.offer(type); } final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setMax(mMaxProgress); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(new LanguageAdapter(availableLocales)); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ProgressType type = mProgressTypes.poll(); switch (type) { case INDETERMINATE: fab.setShowProgressBackground(true); fab.setIndeterminate(true); mProgressTypes.offer(ProgressType.INDETERMINATE); break; case PROGRESS_POSITIVE: fab.setIndeterminate(false); fab.setProgress(70, true); mProgressTypes.offer(ProgressType.PROGRESS_POSITIVE); break; case PROGRESS_NEGATIVE: fab.setProgress(30, true); mProgressTypes.offer(ProgressType.PROGRESS_NEGATIVE); break; case HIDDEN: fab.hideProgress(); mProgressTypes.offer(ProgressType.HIDDEN); break; case PROGRESS_NO_ANIMATION: increaseProgress(fab, 0); break; case PROGRESS_NO_BACKGROUND: fab.setShowProgressBackground(false); fab.setIndeterminate(true); mProgressTypes.offer(ProgressType.PROGRESS_NO_BACKGROUND); break; } } }); recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (Math.abs(dy) > mScrollOffset) { if (dy > 0) { fab.hide(true); } else { fab.show(true); } } } }); } private void increaseProgress(final FloatingActionButton fab, int i) { if (i <= mMaxProgress) { fab.setProgress(i, false); final int progress = ++i; mUiHandler.postDelayed(new Runnable() { @Override public void run() { increaseProgress(fab, progress); } }, 30); } else { mUiHandler.postDelayed(new Runnable() { @Override public void run() { fab.hideProgress(); } }, 200); mProgressTypes.offer(ProgressType.PROGRESS_NO_ANIMATION); } } private class LanguageAdapter extends RecyclerView.Adapter<ViewHolder> { private Locale[] mLocales; private LanguageAdapter(Locale[] mLocales) { this.mLocales = mLocales; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { TextView tv = (TextView) LayoutInflater.from(parent.getContext()) .inflate(android.R.layout.simple_list_item_1, parent, false); return new ViewHolder(tv); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.mTextView.setText(mLocales[position].getDisplayName()); } @Override public int getItemCount() { return mLocales.length; } } private static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(TextView v) { super(v); mTextView = v; } } private enum ProgressType { INDETERMINATE, PROGRESS_POSITIVE, PROGRESS_NEGATIVE, HIDDEN, PROGRESS_NO_ANIMATION, PROGRESS_NO_BACKGROUND } }