Skip to content

Instantly share code, notes, and snippets.

@drmkraja
Last active July 21, 2020 06:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drmkraja/f14f38f1fc8a88047123c3907ba0c724 to your computer and use it in GitHub Desktop.
Save drmkraja/f14f38f1fc8a88047123c3907ba0c724 to your computer and use it in GitHub Desktop.
public class Category implements ViewModel {
@SerializedName("id")
@Expose
private String id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("image")
@Expose
private String image;
@SerializedName("image_url")
@Expose
private String imageUrl;
private Boolean isChecked;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public Boolean getChecked() {
return isChecked;
}
public void setChecked(Boolean checked) {
isChecked = checked;
}
}
public class CauseCategoryActivity extends BaseActivity {
RecyclerView mRecyclerView;
RendererRecyclerViewAdapter mRecyclerViewAdapter;
CauseCategoryViewModel mViewModel;
CauseCategoryViewModel.CauseViewModelFactory mFactory;
private ContentLoadingProgressBar progressBar;
private ArrayList<Category> mSelectedUsers = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cause);
mFactory = InjectorUtils.provideCauseFactory(this.getApplicationContext());
mViewModel = new ViewModelProvider(this, mFactory).get(CauseCategoryViewModel.class);
mRecyclerView = findViewById(R.id.recyclerview);
progressBar = findViewById(R.id.progress);
mRecyclerViewAdapter = new RendererRecyclerViewAdapter();
mRecyclerViewAdapter.registerRenderer(createStargazerRenderer(R.layout.item_user_full_width));
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
mRecyclerView.setAdapter(mRecyclerViewAdapter);
mViewModel.getCauseDetails().observe(this, apiResponse -> {
if (apiResponse != null) {
for (int i = 0; i < apiResponse.size(); i++) {
Category mDetail = apiResponse.get(i);
Log.e("Cause ACTIVITY > ", mDetail.getName());
}
progressBar.hide();
mRecyclerViewAdapter.setItems(apiResponse);
mRecyclerViewAdapter.notifyDataSetChanged();
}
});
}
private ViewRenderer createStargazerRenderer(final int layout) {
return new StargazerViewRenderer(layout, new Listener(), 1);
}
private class Listener implements StargazerViewRenderer.Listener {
@Override
public void onStargazerItemClicked(@NonNull final Category model, final boolean isChecked) {
this.onStargazerClicked(model, isChecked);
mRecyclerViewAdapter.notifyDataSetChanged();
}
public void onStargazerClicked(@NonNull final Category model, final boolean isChecked) {
if (isChecked) {
Log.e("onStargazerClicked: ", "ADD >" + model.getName());
mSelectedUsers.add(model);
} else {
Log.e("onStargazerClicked: ", "REMOVE >" + model.getName());
mSelectedUsers.remove(model);
}
mRecyclerViewAdapter.notifyDataSetChanged();
if (mSelectedUsers.isEmpty()) {
Log.e("SELECTION", "Please Select Anyone");
} else {
Log.e("SELECTION", "Thanks for selecting...");
}
}
}
}
public class StargazerViewHolder extends ViewHolder {
public final TextView name;
public final ImageView avatar;
public final View check;
public StargazerViewHolder(final View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
avatar = (ImageView) itemView.findViewById(R.id.avatar);
check = itemView.findViewById(R.id.check);
}
}
public class StargazerViewRenderer extends ViewRenderer<Category, ViewFinder> {
int MODE_SINGLE = 1;
int MODE_MULTIPLE = 2;
public StargazerViewRenderer(final int layoutID, @NonNull final Listener listener, int mode) {
super(layoutID, Category.class, (model, finder, payloads) -> finder
.setVisibility(R.id.check, model.getChecked() ? VISIBLE : GONE)
.find(R.id.avatar, (ViewProvider<AvatarView>) urlImageView -> {
urlImageView.setUrl(model.getImageUrl());
})
.setText(R.id.title, model.getName())
.setOnClickListener(() -> {
Log.e("VR > ", "SELECTED");
final boolean willChecked = finder.find(R.id.check).getVisibility() == GONE;
finder.find(R.id.check).setVisibility(willChecked ? VISIBLE : GONE);
listener.onStargazerItemClicked(model, willChecked);
model.setChecked(true);
})
.setOnClickListener(R.id.check, () -> {
Log.e("VR > ", "DE > SELECTED");
final boolean willChecked = finder.find(R.id.check).getVisibility() == GONE;
finder.find(R.id.check).setVisibility(willChecked ? VISIBLE : GONE);
listener.onStargazerItemClicked(model, willChecked);
model.setChecked(false);
}));
}
@Nullable
@Override
public ViewState createViewState() {
return new StargazerViewState();
}
@Override
public int createViewStateID(@NonNull final Category model) {
return Integer.parseInt(model.getID());
}
public interface Listener {
void onStargazerItemClicked(@NonNull Category model, final boolean isChecked);
}
public class StargazerViewState implements ViewState<ViewHolder>, Serializable {
private int mVisibility;
@Override
public void clear(@NonNull final ViewHolder holder) {
holder.getViewFinder().setVisible(R.id.check, false);
}
@Override
public void save(@NonNull final ViewHolder holder) {
holder.getViewFinder().find(R.id.check, view -> mVisibility = view.getVisibility());
}
@Override
public void restore(@NonNull final ViewHolder holder) {
holder.getViewFinder().setVisibility(R.id.check, mVisibility);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment