Skip to content

Commit

Permalink
Merge pull request #7 from AlanCheen/develop
Browse files Browse the repository at this point in the history
Develop 0.4.0 feature
  • Loading branch information
AlanCheen authored Dec 5, 2018
2 parents 2e07187 + fcef652 commit 599df51
Show file tree
Hide file tree
Showing 12 changed files with 100 additions and 68 deletions.
44 changes: 28 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@

[ ![Download](https://api.bintray.com/packages/alancheen/maven/flap/images/download.svg?version=0.3.0) ](https://bintray.com/alancheen/maven/flap/0.3.0/link) [![Build Status](https://travis-ci.org/AlanCheen/Flap.svg?branch=master)](https://travis-ci.org/AlanCheen/Flap)

Flap is an Android library that make RecyclerView.Adapter more easier to use.

Especially when you have to support lots of different type ViewHolders.

Flap will make you enjoy developing ViewHolders.
Flap is an library that makes RecyclerView.Adapter more easier to use , especially when you have to support lots of different type ViewHolders.

And you will save a lot of time by avoiding writing lots of boilerplate code with Flap.

Btw , Flap integrated with Lifecycle , you can get the lifecycle callback easily which is very helpful.
Flap can save your day by keeping you from writing boilerplate codes.

Have a try , thanks !

Expand Down Expand Up @@ -43,20 +39,20 @@ public class SimpleTextModel {
}
```

#### Step 2 : Create a `FlapViewHolder` and `LayoutTypeItemFactory` :
#### Step 2 : Create a `FlapItem` and `FlapItemFactory` :

`FlapViewHolder` is the base ViewHolder class that Flap is using which provides useful methods.
`FlapItem` is a base `ViewHolder` that Flap is using which provides useful methods.

`LayoutTypeItemFactory` is a `ItemFactory` that tells Flap how to create a `FlapViewHolder`.
`FlapItemFactory` tells Flap the layout res id which is used when creating a `FlapItem`.

Here is a sample :

```java
public class SimpleTextItemViewHolder extends FlapViewHolder<SimpleTextModel> {
public class SimpleTextItem extends FlapItem<SimpleTextModel> {

private TextView tvContent;

public SimpleTextItemViewHolder(final View itemView) {
public SimpleTextItem(final View itemView) {
super(itemView);
tvContent = findViewById(R.id.tv_content);
}
Expand All @@ -66,17 +62,19 @@ public class SimpleTextItemViewHolder extends FlapViewHolder<SimpleTextModel> {
tvContent.setText(model.content);
}

public static class SimpleTextItemFactory extends LayoutTypeItemFactory<SimpleTextModel, SimpleTextItemViewHolder> {
public static class SimpleTextItemFactory extends FlapItemFactory<SimpleTextModel, SimpleTextItem> {

@Override
protected int getLayoutResId(final SimpleTextModel model) {
return R.layout.flap_item_simple_text;
}

}

}
```

#### Step 3 : Create a `FlapAdapter` and register the `LayoutTypeItemFactory`
#### Step 3 : Create a `FlapAdapter` and register the `FlapItemFactory`

Create your `FlapAdapter` and register the `SimpleTextItemFactory` that we already created , setup the models :

Expand All @@ -103,16 +101,30 @@ You are good to go!

## More Feature

Flap adds some features for `FlapViewHolder` :
Flap adds some features for `FlapItem` :

1. Access a context directly by field `context`
2. Call `findViewById()` instead of `itemView.findViewById`

What's more , here are some methods for you that you can override if you need :

1. Override `onBind(final T model, final FlapAdapter adapter, final List<Object> payloads)` when you wanna access your adapter or payloads.
2. Override `onViewAttachedToWindow` & `onViewDetachedFromWindow` so that you can do something like pause or resume a video.
3. Override lifecycle callbacks : `onResume``onPause``onStop``onDestroy` when you care about the lifecycle , FlapAdapter binds the LifecycleOwner automatically.
2. Override `onViewAttachedToWindow` & `onViewDetachedFromWindow` so that you can do something like pausing or resuming a video.



### Enable Lifecycle

By extending `LifecycleItem` , a lifecycle aware `ViewHolder` , you can get the lifecycle callbacks : `onResume``onPause``onStop``onDestroy` when you care about the lifecycle , `FlapAdapter` binds the `LifecycleOwner` automatically.


Releated methods :

1. `FlapAdapter.setLifecycleEnable(boolean lifecycleEnable) ` enabled by default

2. `FlapAdapter.setLifecycleOwner(@NonNull final LifecycleOwner lifecycleOwner)`



## Change Log

Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/me/yifeiyuan/flapdev/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import me.yifeiyuan.flap.FlapAdapter;
import me.yifeiyuan.flapdev.simpleimage.SimpleImageModel;
import me.yifeiyuan.flapdev.simpleimage.SimpleImageVH;
import me.yifeiyuan.flapdev.simpletext.SimpleTextItemViewHolder;
import me.yifeiyuan.flapdev.simpletext.SimpleTextItem;
import me.yifeiyuan.flapdev.simpletext.SimpleTextModel;

public class MainActivity extends AppCompatActivity {
Expand All @@ -24,7 +24,7 @@ protected void onCreate(Bundle savedInstanceState) {

FlapAdapter adapter = new FlapAdapter();

adapter.registerItemFactory(new SimpleTextItemViewHolder.SimpleTextItemFactory())
adapter.registerItemFactory(new SimpleTextItem.SimpleTextItemFactory())
.registerItemFactory(new SimpleImageVH.SimpleImageItemFactory());

List<Object> models = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
import android.view.View;
import android.view.ViewGroup;

import me.yifeiyuan.flap.FlapViewHolder;
import me.yifeiyuan.flap.FlapItem;
import me.yifeiyuan.flap.ItemFactory;
import me.yifeiyuan.flapdev.R;

/**
* Created by 程序亦非猿 on 2018/12/4.
*/
public class SimpleImageVH extends FlapViewHolder<SimpleImageModel> {
public class SimpleImageVH extends FlapItem<SimpleImageModel> {

public SimpleImageVH(final View itemView) {
super(itemView);
Expand All @@ -27,7 +27,7 @@ public static class SimpleImageItemFactory implements ItemFactory<SimpleImageMod

@NonNull
@Override
public FlapViewHolder onCreateViewHolder(@NonNull final LayoutInflater inflater, @NonNull final ViewGroup parent, final int viewType) {
public FlapItem onCreateViewHolder(@NonNull final LayoutInflater inflater, @NonNull final ViewGroup parent, final int viewType) {
return new SimpleImageVH(inflater.inflate(viewType, parent, false));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@
import android.view.View;
import android.widget.TextView;

import me.yifeiyuan.flap.FlapViewHolder;
import me.yifeiyuan.flap.LayoutTypeItemFactory;
import me.yifeiyuan.flap.FlapItem;
import me.yifeiyuan.flap.FlapItemFactory;
import me.yifeiyuan.flapdev.R;

/**
* Created by 程序亦非猿 on 2018/12/4.
*/
public class SimpleTextItemViewHolder extends FlapViewHolder<SimpleTextModel> {
public class SimpleTextItem extends FlapItem<SimpleTextModel> {

private TextView tvContent;

public SimpleTextItemViewHolder(final View itemView) {
public SimpleTextItem(final View itemView) {
super(itemView);
tvContent = findViewById(R.id.tv_content);
}
Expand All @@ -24,7 +24,7 @@ protected void onBind(final SimpleTextModel model) {
tvContent.setText(model.content);
}

public static class SimpleTextItemFactory extends LayoutTypeItemFactory<SimpleTextModel, SimpleTextItemViewHolder> {
public static class SimpleTextItemFactory extends FlapItemFactory<SimpleTextModel, SimpleTextItem> {

@Override
protected int getLayoutResId(final SimpleTextModel model) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
*
* It's the default ViewHolder would be used when something wrong was happened so that we won't get a crash.
*/
class DefaultViewHolder extends FlapViewHolder {
class DefaultFlapItem extends FlapItem {

DefaultViewHolder(final View itemView) {
DefaultFlapItem(final View itemView) {
super(itemView);
}

Expand Down
8 changes: 4 additions & 4 deletions flap/src/main/java/me/yifeiyuan/flap/Flap.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,9 @@ public int getItemViewType(@NonNull final Object model) {

@NonNull
@Override
public FlapViewHolder onCreateViewHolder(@NonNull final LayoutInflater inflater, @NonNull final ViewGroup parent, final int viewType) {
public FlapItem onCreateViewHolder(@NonNull final LayoutInflater inflater, @NonNull final ViewGroup parent, final int viewType) {

FlapViewHolder vh = null;
FlapItem vh = null;

ItemFactory factory = factoryMapping.get(viewType);
if (null != factory) {
Expand All @@ -104,7 +104,7 @@ public FlapViewHolder onCreateViewHolder(@NonNull final LayoutInflater inflater,

@NonNull
@Override
public FlapViewHolder onCreateDefaultViewHolder(@NonNull final LayoutInflater inflater, @NonNull final ViewGroup parent, final int viewType) {
return new DefaultViewHolder(new View(parent.getContext()));
public FlapItem onCreateDefaultViewHolder(@NonNull final LayoutInflater inflater, @NonNull final ViewGroup parent, final int viewType) {
return new DefaultFlapItem(new View(parent.getContext()));
}
}
23 changes: 14 additions & 9 deletions flap/src/main/java/me/yifeiyuan/flap/FlapAdapter.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package me.yifeiyuan.flap;

import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
Expand All @@ -14,7 +15,7 @@
/**
* Created by 程序亦非猿
*/
public class FlapAdapter extends RecyclerView.Adapter<FlapViewHolder> implements ItemFactoryManager {
public class FlapAdapter extends RecyclerView.Adapter<FlapItem> implements ItemFactoryManager {

@NonNull
private Flap flap = Flap.getDefault();
Expand All @@ -28,24 +29,28 @@ public class FlapAdapter extends RecyclerView.Adapter<FlapViewHolder> implements

@NonNull
@Override
public FlapViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) {
public FlapItem onCreateViewHolder(@NonNull final ViewGroup parent, final int viewType) {
return flap.onCreateViewHolder(LayoutInflater.from(parent.getContext()), parent, viewType);
}

@Override
public final void onBindViewHolder(@NonNull final FlapViewHolder holder, final int position) {
public final void onBindViewHolder(@NonNull final FlapItem holder, final int position) {
//ignore
}

@SuppressWarnings("unchecked")
@Override
public void onBindViewHolder(@NonNull final FlapViewHolder holder, final int position, @NonNull final List<Object> payloads) {
if (lifecycleEnable && null != lifecycleOwner) {
lifecycleOwner.getLifecycle().addObserver(holder);
}
public void onBindViewHolder(@NonNull final FlapItem holder, final int position, @NonNull final List<Object> payloads) {
attachLifecycleOwnerIfNeed(holder);
holder.bind(getModel(position), this, payloads);
}

private void attachLifecycleOwnerIfNeed(final FlapItem holder) {
if (lifecycleEnable && lifecycleOwner != null && holder instanceof LifecycleObserver) {
lifecycleOwner.getLifecycle().addObserver((LifecycleObserver) holder);
}
}

@Override
public int getItemCount() {
return getModels().size();
Expand Down Expand Up @@ -77,13 +82,13 @@ public void onAttachedToRecyclerView(@NonNull final RecyclerView recyclerView) {
}

@Override
public void onViewAttachedToWindow(@NonNull FlapViewHolder holder) {
public void onViewAttachedToWindow(@NonNull FlapItem holder) {
super.onViewAttachedToWindow(holder);
holder.onViewAttachedToWindow();
}

@Override
public void onViewDetachedFromWindow(@NonNull FlapViewHolder holder) {
public void onViewDetachedFromWindow(@NonNull FlapItem holder) {
super.onViewDetachedFromWindow(holder);
holder.onViewDetachedFromWindow();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package me.yifeiyuan.flap;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
import android.content.Context;
import android.support.annotation.IdRes;
import android.support.v7.widget.RecyclerView;
Expand All @@ -15,11 +12,11 @@
*
* The base ViewHolder provides some useful convenient abilities.
*/
public abstract class FlapViewHolder<T> extends RecyclerView.ViewHolder implements LifecycleObserver {
public abstract class FlapItem<T> extends RecyclerView.ViewHolder {

protected final Context context;

public FlapViewHolder(View itemView) {
public FlapItem(View itemView) {
super(itemView);
context = itemView.getContext();
}
Expand All @@ -39,31 +36,15 @@ protected final <V extends View> V findViewById(@IdRes int viewId) {
}

/**
* @see FlapAdapter#onViewAttachedToWindow(FlapViewHolder)
* @see FlapAdapter#onViewAttachedToWindow(FlapItem)
*/
void onViewAttachedToWindow() {
}

/**
* @see FlapAdapter#onViewDetachedFromWindow(FlapViewHolder)
* @see FlapAdapter#onViewDetachedFromWindow(FlapItem)
*/
void onViewDetachedFromWindow() {
}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
/**
* Created by 程序亦非猿
*/
public abstract class LayoutTypeItemFactory<T, VH extends FlapViewHolder> implements ItemFactory<T> {
public abstract class FlapItemFactory<T, VH extends FlapItem> implements ItemFactory<T> {

@SuppressWarnings("unchecked")
@NonNull
Expand Down
4 changes: 2 additions & 2 deletions flap/src/main/java/me/yifeiyuan/flap/IFlap.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ public interface IFlap extends ItemFactoryManager {
int getItemViewType(@NonNull Object model);

@NonNull
FlapViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent, int viewType);
FlapItem onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent, int viewType);

@NonNull
FlapViewHolder onCreateDefaultViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent, int viewType);
FlapItem onCreateDefaultViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent, int viewType);
}
2 changes: 1 addition & 1 deletion flap/src/main/java/me/yifeiyuan/flap/ItemFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
public interface ItemFactory<T> {

@NonNull
FlapViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent, int viewType);
FlapItem onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent, int viewType);

int getItemViewType(T model);
}
34 changes: 34 additions & 0 deletions flap/src/main/java/me/yifeiyuan/flap/LifecycleItem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package me.yifeiyuan.flap;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
import android.view.View;

/**
* Flap
* Created by 程序亦非猿 on 2018/12/5.
*/
public abstract class LifecycleItem<T> extends FlapItem<T> implements LifecycleObserver {

public LifecycleItem(final View itemView) {
super(itemView);
}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
}

}

0 comments on commit 599df51

Please sign in to comment.