mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 12:23:58 +01:00
#3468 Switch from RvRenderer to AdapterDelegates - replace UploadCategoryDepictionsRenderer
This commit is contained in:
parent
88c307d265
commit
c7d25e12cc
9 changed files with 82 additions and 187 deletions
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
)
|
||||
|
||||
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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"/>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue