Skip to content

Commit

Permalink
fix naming; simplify KDelegateAdapters (less boilerplate).
Browse files Browse the repository at this point in the history
  • Loading branch information
D00mch committed Apr 7, 2020
1 parent 416bc08 commit bc2e637
Show file tree
Hide file tree
Showing 41 changed files with 301 additions and 308 deletions.
2 changes: 2 additions & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 14 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ android {
experimental = true
}
}
implementation 'com.github.liverm0r:delegateadapters:v2.03'
implementation 'com.github.liverm0r:delegateadapters:v2.1'
```

You also have to add this in your project build.gradle
Expand All @@ -40,36 +40,30 @@ allprojects {
Write a model, which represents ui data:

```kotlin
class ImageViewModel(val title: String, @DrawableRes val imageRes: Int) : IComparableItem {

override fun id(): Any = title
override fun content(): Any = title + imageRes
data class ImageItem(val title: String, @DrawableRes val imageRes: Int) : KDiffUtilItem {
override val id: Any = title
}

```

ImageViewModel is just a POJO, implementing IComparableItem to be able to animate it out of the box with DiffUtils.
ImageItem is just a POJO, implementing DiffUtilItem to be able to animate it out of the box with DiffUtils.

Write a delegate adapter:

```kotlin
class ImageDelegateAdapter(private val onImageClick: (ImageViewModel) -> Unit)
: KDelegateAdapter<ImageViewModel>() {
class ImageDelegateAdapter(private val clickListener: View.OnClickListener) : KDelegateAdapter<ImageItem>() {

override fun onBind(item: ImageViewModel, viewHolder: KViewHolder)= with(viewHolder) {
override fun KViewHolder.onBind(item: ImageItem) {
tv_title.text = item.title
img_bg.setOnClickListener { onImageClick(item) }
img_bg.setOnClickListener(clickListener)
img_bg.setImageResource(item.imageRes)
}

override fun isForViewType(items: List<*>, position: Int) = items[position] is ImageViewModel

override fun isForViewType(item: Any) = item is ImageItem
override fun getLayoutId(): Int = R.layout.image_item
}

```

Check `with(viewHolder)` part. This works like the basic view holder without creating one. Just override onBind and onCreate methods. See the [View holder pattern support and caching options](
Check `KViewHolder.onBind` part. This works like the basic view holder without creating one. Just override onBind and onCreate methods. See the [View holder pattern support and caching options](
https://github.com/Kotlin/KEEP/blob/master/proposals/android-extensions-entity-caching.md
) for more information.

Expand Down Expand Up @@ -102,12 +96,12 @@ See example in code: [KotlinBaseExampleActivity.kt][1]
Write a Model:

```java
public class TextViewModel implements IComparableItem {
public class TextItem implements IComparableItem {

@NonNull public final String title;
@NonNull public final String description;

public TextViewModel(@NonNull String title, @NonNull String description) {
public TextItem(@NonNull String title, @NonNull String description) {
this.title = title;
this.description = description;
}
Expand All @@ -122,11 +116,11 @@ Inherit from BaseDelegateAdapter:

```java
public class TextDelegateAdapter extends
BaseDelegateAdapter<TextDelegateAdapter.TextViewHolder, TextViewModel> {
BaseDelegateAdapter<TextDelegateAdapter.TextViewHolder, TextItem> {

@Override
protected void onBindViewHolder(@NonNull View view,
@NonNull TextViewModel item,
@NonNull TextItem item,
@NonNull TextViewHolder viewHolder) {
viewHolder.tvTitle.setText(item.title);
viewHolder.tvDescription.setText(item.description);
Expand All @@ -145,7 +139,7 @@ public class TextDelegateAdapter extends

@Override
public boolean isForViewType(@NonNull List<?> items, int position) {
return items.get(position) instanceof TextViewModel;
return items.get(position) instanceof TextItem;
}

final static class TextViewHolder extends BaseViewHolder {
Expand Down
2 changes: 1 addition & 1 deletion delegateadapter/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.delegateadapter"/>
package="com.livermor.delegateadapter"/>

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.delegateadapter.delegate;
package com.livermor.delegateadapter.delegate;

import android.view.LayoutInflater;
import android.view.View;
Expand All @@ -14,7 +14,7 @@
* @author dumchev on 03.11.17.
*/
public abstract class BaseDelegateAdapter
<VH extends BaseViewHolder, T> implements IDelegateAdapter<VH, T> {
<VH extends BaseViewHolder, T> implements DelegateAdapter<VH, T> {

abstract protected void onBindViewHolder(@NonNull View view,
@NonNull T item, @NonNull VH viewHolder);
Expand Down Expand Up @@ -42,6 +42,7 @@ public final RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup paren
holder.setListener(new BaseViewHolder.ItemInflateListener() {
@Override
public void inflated(Object viewType, View view) {
//noinspection unchecked
onBindViewHolder(view, (T) viewType, holder);
}
});
Expand All @@ -53,6 +54,6 @@ public final void onBindViewHolder(
@NonNull VH holder,
@NonNull List<T> items,
int position) {
((BaseViewHolder) holder).bind(items.get(position));
holder.bind(items.get(position));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.delegateadapter.delegate;
package com.livermor.delegateadapter.delegate;

import android.view.View;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.delegateadapter.delegate;
package com.livermor.delegateadapter.delegate;

import android.util.SparseArray;
import android.view.ViewGroup;
Expand All @@ -17,17 +17,18 @@ public class CompositeDelegateAdapter<T> extends RecyclerView.Adapter<RecyclerVi
private static final String TAG = CompositeDelegateAdapter.class.getSimpleName();
private static final int FIRST_VIEW_TYPE = 0;

protected final SparseArray<IDelegateAdapter> typeToAdapterMap;
protected final @NonNull List<T> data = new ArrayList<>();
protected final SparseArray<DelegateAdapter> typeToAdapterMap;
protected final @NonNull
List<T> data = new ArrayList<>();

protected CompositeDelegateAdapter(@NonNull SparseArray<IDelegateAdapter> typeToAdapterMap) {
protected CompositeDelegateAdapter(@NonNull SparseArray<DelegateAdapter> typeToAdapterMap) {
this.typeToAdapterMap = typeToAdapterMap;
}

@Override
public final int getItemViewType(int position) {
for (int i = FIRST_VIEW_TYPE; i < typeToAdapterMap.size(); i++) {
final IDelegateAdapter delegate = typeToAdapterMap.valueAt(i);
final DelegateAdapter delegate = typeToAdapterMap.valueAt(i);
//noinspection unchecked
if (delegate.isForViewType(data, position)) {
return typeToAdapterMap.keyAt(i);
Expand All @@ -43,13 +44,9 @@ public final RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int vi

@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final IDelegateAdapter delegateAdapter = typeToAdapterMap.get(getItemViewType(position));
if (delegateAdapter != null) {
//noinspection unchecked
delegateAdapter.onBindViewHolder(holder, data, position);
} else {
throw new NullPointerException("can not find adapter for position " + position);
}
final DelegateAdapter delegateAdapter = typeToAdapterMap.get(getItemViewType(position));
//noinspection unchecked
delegateAdapter.onBindViewHolder(holder, data, position);
}

@Override
Expand All @@ -72,19 +69,21 @@ public final int getItemCount() {
public static class Builder<T> {

private int count;
private final SparseArray<IDelegateAdapter> typeToAdapterMap;
private final SparseArray<DelegateAdapter> typeToAdapterMap;

public Builder() {
typeToAdapterMap = new SparseArray<>();
}

public Builder<T> add(@NonNull IDelegateAdapter<?, ? extends T> delegateAdapter) {
public Builder<T> add(@NonNull DelegateAdapter<?, ? extends T> delegateAdapter) {
typeToAdapterMap.put(count++, delegateAdapter);
return this;
}

public CompositeDelegateAdapter<T> build() {
if (count == 0) throw new IllegalArgumentException("Register at least one adapter");
if (count == 0) {
throw new IllegalArgumentException("Register at least one adapter");
}
return new CompositeDelegateAdapter<>(typeToAdapterMap);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.delegateadapter.delegate;
package com.livermor.delegateadapter.delegate;

import android.view.ViewGroup;

Expand All @@ -10,7 +10,7 @@
/**
* @author dumchev on 03.11.17.
*/
public interface IDelegateAdapter<VH extends RecyclerView.ViewHolder, T> {
public interface DelegateAdapter<VH extends RecyclerView.ViewHolder, T> {

@NonNull
RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType);
Expand All @@ -21,5 +21,5 @@ void onBindViewHolder(@NonNull VH holder,

void onRecycled(@NonNull VH holder);

boolean isForViewType(@NonNull List<?> items, int position);
boolean isForViewType(@NonNull List<Object> items, int position);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.livermor.delegateadapter.delegate

import android.view.View
import kotlinx.android.extensions.LayoutContainer

/**
* @author dumchev on 04.11.17.
*/
abstract class KDelegateAdapter<T>
: BaseDelegateAdapter<KDelegateAdapter.KViewHolder, T>() {

open fun onCreated(view: View) = Unit

abstract fun KViewHolder.onBind(item: T)

abstract fun isForViewType(item: Any): Boolean

override fun isForViewType(items: List<Any>, position: Int): Boolean = isForViewType(items[position])

final override fun onBindViewHolder(view: View, item: T, viewHolder: KViewHolder) = viewHolder.onBind(item)

override fun createViewHolder(parent: View): KViewHolder = KViewHolder(parent, ::onCreated)

class KViewHolder(override val containerView: View, onCreated: (View) -> Unit) : BaseViewHolder(containerView),
LayoutContainer {

init {
onCreated(containerView)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.delegateadapter.delegate.diff;
package com.livermor.delegateadapter.delegate.diff;


import androidx.annotation.NonNull;
Expand All @@ -11,11 +11,11 @@
*/
public class DiffUtilCallback extends DiffUtil.Callback {

private final List<? extends IComparableItem> oldList;
private final List<? extends IComparableItem> newList;
private final List<? extends DiffUtilItem> oldList;
private final List<? extends DiffUtilItem> newList;

public DiffUtilCallback(@NonNull List<? extends IComparableItem> oldList,
@NonNull List<? extends IComparableItem> newList) {
public DiffUtilCallback(@NonNull List<? extends DiffUtilItem> oldList,
@NonNull List<? extends DiffUtilItem> newList) {
this.oldList = oldList;
this.newList = newList;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
package com.example.delegateadapter.delegate.diff;
package com.livermor.delegateadapter.delegate.diff;

import android.util.SparseArray;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;

import com.example.delegateadapter.delegate.CompositeDelegateAdapter;
import com.example.delegateadapter.delegate.IDelegateAdapter;
import com.livermor.delegateadapter.delegate.CompositeDelegateAdapter;
import com.livermor.delegateadapter.delegate.DelegateAdapter;

import java.util.List;

/**
* @author dumchev on 16.11.17.
*/
public class DiffUtilCompositeAdapter extends CompositeDelegateAdapter<IComparableItem> {
public class DiffUtilCompositeAdapter extends CompositeDelegateAdapter<DiffUtilItem> {

protected DiffUtilCompositeAdapter(@NonNull SparseArray<IDelegateAdapter> typeToAdapterMap) {
protected DiffUtilCompositeAdapter(@NonNull SparseArray<DelegateAdapter> typeToAdapterMap) {
super(typeToAdapterMap);
}

@Override
public void swapData(@NonNull List<IComparableItem> data) {
public void swapData(@NonNull List<DiffUtilItem> data) {
final DiffUtilCallback diffCallback = new DiffUtilCallback(this.data, data);
final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
this.data.clear();
Expand All @@ -32,14 +32,14 @@ public void swapData(@NonNull List<IComparableItem> data) {
public static class Builder {

private int count;
private final SparseArray<IDelegateAdapter> typeToAdapterMap;
private final SparseArray<DelegateAdapter> typeToAdapterMap;

public Builder() {
typeToAdapterMap = new SparseArray<>();
}

public Builder add(
@NonNull IDelegateAdapter<?, ? extends IComparableItem> delegateAdapter) {
@NonNull DelegateAdapter<?, ? extends DiffUtilItem> delegateAdapter) {
typeToAdapterMap.put(count++, delegateAdapter);
return this;
}
Expand Down
Loading

0 comments on commit bc2e637

Please sign in to comment.