#3468 Switch from RvRenderer to AdapterDelegates - replace SearchImagesRenderer

This commit is contained in:
Sean Mac Gillicuddy 2020-05-13 11:12:12 +01:00
parent 58af240c9d
commit f083eb653e
7 changed files with 61 additions and 148 deletions

View file

@ -33,9 +33,9 @@ import io.reactivex.schedulers.Schedulers;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import javax.inject.Named;
import kotlin.Unit;
import timber.log.Timber;
/**
@ -66,16 +66,9 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
*/
private int mediaSize = 0;
private RVRendererAdapter<Media> imagesAdapter;
private SearchImagesAdapter imagesAdapter;
private List<Media> queryList = new ArrayList<>();
private final SearchImagesAdapterFactory adapterFactory = new SearchImagesAdapterFactory(item -> {
// Called on Click of a individual media Item
int index = queryList.indexOf(item);
((SearchActivity)getContext()).onSearchImageClicked(index);
saveQuery(query);
});
/**
* This method saves Search Query in the Recent Searches Database.
* @param query
@ -106,8 +99,11 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
else{
imagesRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
}
ArrayList<Media> items = new ArrayList<>();
imagesAdapter = adapterFactory.create(items);
imagesAdapter =new SearchImagesAdapter(media -> {
((SearchActivity)getContext()).onSearchImageClicked(imagesAdapter.getItems().indexOf(media));
saveQuery(query);
return Unit.INSTANCE;
});
imagesRecyclerView.setAdapter(imagesAdapter);
imagesRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
@ -173,7 +169,6 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
if (mediaList.size() != 0 && !queryList.get(queryList.size() - 1).getFilename().equals(mediaList.get(mediaList.size() - 1).getFilename())) {
queryList.addAll(mediaList);
imagesAdapter.addAll(mediaList);
imagesAdapter.notifyDataSetChanged();
((SearchActivity) getContext()).viewPagerNotifyDataSetChanged();
}
}
@ -222,8 +217,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
private void handleLabelforImage(String s, int position) {
if (!s.trim().equals(getString(R.string.detail_caption_empty))) {
imagesAdapter.getItem(position).setThumbnailTitle(s);
imagesAdapter.notifyDataSetChanged();
imagesAdapter.updateThumbnail(position, s);
}
}
@ -281,13 +275,11 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment {
* @param i position of Media in the recyclerview adapter.
*/
public Media getImageAtPosition(int i) {
if (imagesAdapter.getItem(i).getFilename() == null) {
if (imagesAdapter.getItemAt(i).getFilename() == null) {
// not yet ready to return data
return null;
}
else {
return imagesAdapter.getItem(i);
}
return imagesAdapter.getItemAt(i);
}
@Override public void onDestroyView() {

View file

@ -0,0 +1,27 @@
package fr.free.nrw.commons.explore.images
import com.hannesdorfmann.adapterdelegates4.ListDelegationAdapter
import fr.free.nrw.commons.Media
class SearchImagesAdapter(onImageClicked: (Media) -> Unit) : ListDelegationAdapter<List<Media>>(
searchImagesAdapter(onImageClicked)
) {
fun getItemAt(position: Int) = items[position]
init {
items = emptyList()
}
fun clear() {
items = emptyList()
}
fun addAll(mediaList: List<Media>) {
items = items + mediaList
}
fun updateThumbnail(position: Int, thumbnailTitle: String) {
items[position].thumbnailTitle = thumbnailTitle
notifyItemChanged(position)
}
}

View file

@ -0,0 +1,24 @@
package fr.free.nrw.commons.explore.images
import android.view.View
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateLayoutContainer
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.R
import kotlinx.android.synthetic.main.layout_category_images.*
fun searchImagesAdapter(onImageClicked: (Media) -> Unit) =
adapterDelegateLayoutContainer<Media, Media>(R.layout.layout_category_images) {
categoryImageView.setOnClickListener { onImageClicked(item) }
bind {
categoryImageTitle.text = item.thumbnailTitle
categoryImageView.setImageURI(item.thumbUrl)
if (item.creator?.isNotEmpty() == true) {
categoryImageAuthor.visibility = View.VISIBLE
categoryImageAuthor.text = getString(R.string.image_uploaded_by, item.creator)
} else {
categoryImageAuthor.visibility = View.GONE
}
}
}

View file

@ -1,35 +0,0 @@
package fr.free.nrw.commons.explore.images;
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.Media;
/**
* This class helps in creating adapter for imagesRecyclerView in SearchImagesFragment,
* implementing onClicks on imagesRecyclerView Items
**/
class SearchImagesAdapterFactory {
private final SearchImagesRenderer.ImageClickedListener listener;
SearchImagesAdapterFactory(SearchImagesRenderer.ImageClickedListener listener) {
this.listener = listener;
}
/**
* This method creates a recyclerViewAdapter for Media.
* @param searchImageItemList List of Media objects to be displayed
* @return imagesAdapter
**/
public RVRendererAdapter<Media> create(List<Media> searchImageItemList) {
RendererBuilder<Media> builder = new RendererBuilder<Media>()
.bind(Media.class, new SearchImagesRenderer(listener));
ListAdapteeCollection<Media> collection = new ListAdapteeCollection<>(
searchImageItemList != null ? searchImageItemList : Collections.<Media>emptyList());
return new RVRendererAdapter<>(builder, collection);
}
}

View file

@ -1,74 +0,0 @@
package fr.free.nrw.commons.explore.images;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.pedrogomez.renderers.Renderer;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
/**
* presentation logic of individual image in search is handled here
**/
class SearchImagesRenderer extends Renderer<Media> {
@BindView(R.id.categoryImageTitle) TextView tvImageName;
@BindView(R.id.categoryImageAuthor) TextView categoryImageAuthor;
@BindView(R.id.categoryImageView) SimpleDraweeView browseImage;
private final ImageClickedListener listener;
SearchImagesRenderer(ImageClickedListener listener) {
this.listener = listener;
}
@Override
protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) {
return layoutInflater.inflate(R.layout.layout_category_images, viewGroup, false);
}
@Override
protected void setUpView(View view) {
ButterKnife.bind(this, view);
}
@Override
protected void hookListeners(View view) {
view.setOnClickListener(v -> {
Media item = getContent();
if (listener != null) {
listener.imageClicked(item);
}
});
}
@Override
public void render() {
Media item = getContent();
tvImageName.setText(item.getThumbnailTitle());
browseImage.setImageURI(item.getThumbUrl());
setAuthorView(item, categoryImageAuthor);
}
interface ImageClickedListener {
void imageClicked(Media item);
}
/**
* formats author name as "Uploaded by: authorName" and sets it in textview
*/
private void setAuthorView(Media item, TextView author) {
if (item.getCreator() != null && !item.getCreator().equals("")) {
author.setVisibility(View.VISIBLE);
String uploadedByTemplate = getContext().getString(R.string.image_uploaded_by);
author.setText(String.format(uploadedByTemplate, item.getCreator()));
} else {
author.setVisibility(View.GONE);
}
}
}

View file

@ -1,20 +0,0 @@
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

@ -19,7 +19,6 @@ abstract class BaseDelegateAdapter<T>(
},
*delegates
) {
fun indexOf(item: T): Int = items.indexOf(item)
fun getItemAt(position: Int) = items[position]