#3468 Switch from RvRenderer to AdapterDelegates - replace UploadCategoryDepictionsRenderer

This commit is contained in:
Sean Mac Gillicuddy 2020-05-12 15:11:33 +01:00
parent 88c307d265
commit c7d25e12cc
9 changed files with 82 additions and 187 deletions

View file

@ -1,55 +0,0 @@
package fr.free.nrw.commons.category;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckedTextView;
import com.pedrogomez.renderers.Renderer;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import timber.log.Timber;
/**
* Renders the Categories view
*/
public class CategoriesRenderer extends Renderer<CategoryItem> {
@BindView(R.id.tvName) CheckedTextView checkedView;
private final CategoryClickedListener listener;
CategoriesRenderer(CategoryClickedListener listener) {
this.listener = listener;
}
@Override
protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) {
return layoutInflater.inflate(R.layout.layout_categories_item, viewGroup, false);
}
@Override
protected void setUpView(View view) {
ButterKnife.bind(this, view);
}
@Override
protected void hookListeners(View view) {
view.setOnClickListener(v -> {
CategoryItem item = getContent();
item.setSelected(!item.isSelected());
checkedView.setChecked(item.isSelected());
if (listener != null) {
listener.categoryClicked(item);
}
});
}
@Override
public void render() {
CategoryItem item = getContent();
Timber.e("Rendering: %s", item);
checkedView.setChecked(item.isSelected());
checkedView.setText(item.getName());
}
}

View file

@ -1,30 +1,19 @@
package fr.free.nrw.commons.explore.depictions
import androidx.recyclerview.widget.DiffUtil
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
import fr.free.nrw.commons.upload.categories.BaseAdapter
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
class DepictionAdapter(clickListener: (DepictedItem) -> Unit) :
AsyncListDifferDelegationAdapter<DepictedItem>(
DiffUtil,
depictionDelegate(clickListener)
) {
class DepictionAdapter(clickListener: (DepictedItem) -> Unit) : BaseAdapter<DepictedItem>(
object : DiffUtil.ItemCallback<DepictedItem>() {
override fun areItemsTheSame(oldItem: DepictedItem, newItem: DepictedItem) =
oldItem.id == newItem.id
fun addAll(newResults: List<DepictedItem>) {
items = (items ?: emptyList<DepictedItem>()) + newResults
}
override fun areContentsTheSame(oldItem: DepictedItem, newItem: DepictedItem) =
oldItem == newItem
},
depictionDelegate(clickListener)
)
fun clear() {
items = emptyList()
}
}
object DiffUtil : DiffUtil.ItemCallback<DepictedItem>() {
override fun areItemsTheSame(oldItem: DepictedItem, newItem: DepictedItem) =
oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: DepictedItem, newItem: DepictedItem) =
oldItem == newItem
}

View file

@ -1,27 +0,0 @@
package fr.free.nrw.commons.upload;
import com.pedrogomez.renderers.ListAdapteeCollection;
import com.pedrogomez.renderers.RVRendererAdapter;
import com.pedrogomez.renderers.RendererBuilder;
import java.util.Collections;
import java.util.List;
import fr.free.nrw.commons.category.CategoryClickedListener;
import fr.free.nrw.commons.category.CategoryItem;
public class UploadCategoriesAdapterFactory {
private final CategoryClickedListener listener;
public UploadCategoriesAdapterFactory(CategoryClickedListener listener) {
this.listener = listener;
}
public RVRendererAdapter<CategoryItem> create(List<CategoryItem> placeList) {
RendererBuilder<CategoryItem> builder = new RendererBuilder<CategoryItem>()
.bind(CategoryItem.class, new UploadCategoriesRenderer(listener));
ListAdapteeCollection<CategoryItem> collection = new ListAdapteeCollection<>(
placeList != null ? placeList : Collections.emptyList());
return new RVRendererAdapter<>(builder, collection);
}
}

View file

@ -1,59 +0,0 @@
package fr.free.nrw.commons.upload;
import android.annotation.SuppressLint;
import android.content.res.Configuration;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import com.pedrogomez.renderers.Renderer;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.category.CategoryClickedListener;
import fr.free.nrw.commons.category.CategoryItem;
public class UploadCategoriesRenderer extends Renderer<CategoryItem> {
@BindView(R.id.tvName) CheckBox checkedView;
private final CategoryClickedListener listener;
UploadCategoriesRenderer(CategoryClickedListener listener) {
this.listener = listener;
}
@Override
protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) {
return layoutInflater.inflate(R.layout.layout_upload_categories_item, viewGroup, false);
}
@Override
protected void setUpView(View view) {
ButterKnife.bind(this, view);
Configuration config = getContext().getResources().getConfiguration();
if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
checkedView.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
}
}
@SuppressLint("WrongConstant")
@Override
protected void hookListeners(View view) {
view.setOnClickListener(v -> {
CategoryItem item = getContent();
item.setSelected(!item.isSelected());
checkedView.setChecked(item.isSelected());
if (listener != null) {
listener.categoryClicked(item);
}
});
}
@Override
public void render() {
CategoryItem item = getContent();
checkedView.setChecked(item.isSelected());
checkedView.setText(item.getName());
}
}

View file

@ -0,0 +1,20 @@
package fr.free.nrw.commons.upload.categories
import androidx.recyclerview.widget.DiffUtil
import com.hannesdorfmann.adapterdelegates4.AdapterDelegate
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
abstract class BaseAdapter<T>(
itemCallback: DiffUtil.ItemCallback<T>,
vararg adapterDelegate: AdapterDelegate<List<T>>
) : AsyncListDifferDelegationAdapter<T>(itemCallback, *adapterDelegate) {
fun addAll(newResults: List<T>) {
items = (items ?: emptyList<T>()) + newResults
}
fun clear() {
items = emptyList()
}
}

View file

@ -17,23 +17,19 @@ import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import com.jakewharton.rxbinding2.view.RxView;
import com.jakewharton.rxbinding2.widget.RxTextView;
import com.pedrogomez.renderers.RVRendererAdapter;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.category.CategoryClickedListener;
import fr.free.nrw.commons.category.CategoryItem;
import fr.free.nrw.commons.upload.UploadBaseFragment;
import fr.free.nrw.commons.upload.UploadCategoriesAdapterFactory;
import fr.free.nrw.commons.utils.DialogUtil;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import kotlin.Unit;
import timber.log.Timber;
public class UploadCategoriesFragment extends UploadBaseFragment implements CategoriesContract.View,
CategoryClickedListener {
public class UploadCategoriesFragment extends UploadBaseFragment implements CategoriesContract.View {
@BindView(R.id.tv_title)
TextView tvTitle;
@ -48,16 +44,11 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
@Inject
CategoriesContract.UserActionListener presenter;
private RVRendererAdapter<CategoryItem> adapter;
private UploadCategoryAdapter adapter;
private Disposable subscribe;
private List<CategoryItem> categories;
private boolean isVisible;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@ -103,8 +94,10 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
}
private void initRecyclerView() {
adapter = new UploadCategoriesAdapterFactory(this)
.create(new ArrayList<>());
adapter = new UploadCategoryAdapter(categoryItem -> {
presenter.onCategoryItemClicked(categoryItem);
return Unit.INSTANCE;
});
rvCategories.setLayoutManager(new LinearLayoutManager(getContext()));
rvCategories.setAdapter(adapter);
}
@ -133,11 +126,12 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
@Override
public void setCategories(List<CategoryItem> categories) {
adapter.clear();
if (categories != null) {
if(categories==null) {
adapter.clear();
}
else{
this.categories = categories;
adapter.addAll(categories);
adapter.notifyDataSetChanged();
adapter.setItems(categories);
}
}
@ -168,11 +162,6 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
callback.onPreviousButtonClicked(callback.getIndexInViewFlipper(this));
}
@Override
public void categoryClicked(CategoryItem item) {
presenter.onCategoryItemClicked(item);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);

View file

@ -0,0 +1,18 @@
package fr.free.nrw.commons.upload.categories
import androidx.recyclerview.widget.DiffUtil
import fr.free.nrw.commons.category.CategoryItem
class UploadCategoryAdapter(onCategoryClicked: (CategoryItem) -> Unit) :
BaseAdapter<CategoryItem>(
object : DiffUtil.ItemCallback<CategoryItem>() {
override fun areItemsTheSame(oldItem: CategoryItem, newItem: CategoryItem) =
oldItem.name == newItem.name
override fun areContentsTheSame(oldItem: CategoryItem, newItem: CategoryItem) =
oldItem.name == newItem.name && oldItem.isSelected == newItem.isSelected
},
uploadCategoryDelegate(onCategoryClicked)
)

View file

@ -0,0 +1,20 @@
package fr.free.nrw.commons.upload.categories
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateLayoutContainer
import fr.free.nrw.commons.R
import fr.free.nrw.commons.category.CategoryItem
import kotlinx.android.synthetic.main.layout_upload_categories_item.*
fun uploadCategoryDelegate(onCategoryClicked: (CategoryItem) -> Unit) =
adapterDelegateLayoutContainer<CategoryItem, CategoryItem>(R.layout.layout_upload_categories_item) {
containerView.setOnClickListener {
item.isSelected = !item.isSelected
uploadCategoryCheckbox.isChecked = item.isSelected
onCategoryClicked(item)
}
bind {
uploadCategoryCheckbox.isChecked = item.isSelected
uploadCategoryCheckbox.text = item.name
}
}

View file

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tvName"
android:id="@+id/uploadCategoryCheckbox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkMark="?android:attr/textCheckMark"
android:checked="false"
android:gravity="center_vertical"
android:padding="@dimen/tiny_gap"/>
android:padding="@dimen/tiny_gap"/>