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 SearchImagesRenderer
This commit is contained in:
parent
58af240c9d
commit
f083eb653e
7 changed files with 61 additions and 148 deletions
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -19,7 +19,6 @@ abstract class BaseDelegateAdapter<T>(
|
|||
},
|
||||
*delegates
|
||||
) {
|
||||
fun indexOf(item: T): Int = items.indexOf(item)
|
||||
|
||||
fun getItemAt(position: Int) = items[position]
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue