i have two adapters one for my card view and the other one for my drawer. The cards contains links to other options in the app and the drawer contains the same options. What i want is when user clicks on the card, the options in the drawer menu should get selected. Here is my code.
Drawer Adapter:
#SuppressWarnings({"rawtypes", "ConstantConditions"})
public class DrawerAdapter extends RecyclerView.Adapter<DrawerAdapter.ViewHolder> {
private List<DrawerItem> items;
private Map<Class<? extends DrawerItem>, Integer> viewTypes;
private SparseArray<DrawerItem> holderFactories;
private OnItemSelectedListener listener;
public DrawerAdapter(List<DrawerItem> items) {
this.items = items;
this.viewTypes = new HashMap<>();
this.holderFactories = new SparseArray<>();
processViewTypes();
}
#NonNull
#Override
public ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
ViewHolder holder = holderFactories.get(viewType).createViewHolder(parent);
holder.adapter = this;
return holder;
}
#Override
#SuppressWarnings("unchecked")
public void onBindViewHolder(#NonNull ViewHolder holder, int position) {
items.get(position).bindViewHolder(holder);
}
#Override
public int getItemCount() {
return items.size();
}
#Override
public int getItemViewType(int position) {
return viewTypes.get(items.get(position).getClass());
}
private void processViewTypes() {
int type = 0;
for (DrawerItem item : items) {
if (!viewTypes.containsKey(item.getClass())) {
viewTypes.put(item.getClass(), type);
holderFactories.put(type, item);
type++;
}
}
}
public void setSelected(int position) {
DrawerItem newChecked = items.get(position);
if (!newChecked.isSelectable()) {
return;
}
for (int i = 0; i < items.size(); i++) {
DrawerItem item = items.get(i);
if (item.isChecked()) {
item.setChecked(false);
notifyItemChanged(i);
break;
}
}
newChecked.setChecked(true);
notifyItemChanged(position);
if (listener != null) {
listener.onItemSelected(position);
}
}
public void setListener(OnItemSelectedListener listener) {
this.listener = listener;
}
static abstract class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private DrawerAdapter adapter;
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
#Override
public void onClick(View v) {
adapter.setSelected(getAdapterPosition());
}
}
public interface OnItemSelectedListener {
void onItemSelected(int position);
}
}
Card Adapter:
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {
;
private RecyclerView parentRecycler;
private List<Card> data;
public CardAdapter(List<Card> data) {
this.data = data;
}
#Override
public void onAttachedToRecyclerView(#NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
parentRecycler = recyclerView;
}
#NonNull
#Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View v = inflater.inflate(R.layout.item_card, parent, false);
return new ViewHolder(v);
}
#Override
public void onBindViewHolder(ViewHolder holder, int position) {
Card card = data.get(position);
holder.getAdapterPosition();
Glide.with(holder.itemView.getContext())
.asGif()
.load(card.getCardIcon())
.into(holder.gifImageView);
holder.textView.setText(card.getCardName());
}
#Override
public int getItemCount() {
return data.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private GifImageView gifImageView;
private TextView textView;
public ViewHolder(View itemView) {
super(itemView);
gifImageView = itemView.findViewById(R.id.card_gif);
textView = itemView.findViewById(R.id.card_name);
itemView.findViewById(R.id.container).setOnClickListener(this);
}
public void showText() {
int parentHeight = ((View) gifImageView.getParent()).getHeight();
float scale = (parentHeight - textView.getHeight()) / (float) gifImageView.getHeight();
gifImageView.setPivotX(gifImageView.getWidth() * 0.5f);
gifImageView.setPivotY(0);
gifImageView.animate().scaleX(scale)
.withEndAction(new Runnable() {
#Override
public void run() {
textView.setVisibility(View.VISIBLE);
// gifImageView.setColorFilter(Color.BLACK);
}
})
.scaleY(scale).setDuration(200)
.start();
}
public void hideText() {
textView.setVisibility(View.INVISIBLE);
gifImageView.animate().scaleX(1f).scaleY(1f)
.setDuration(200)
.start();
}
#Override
public void onClick(View v) { parentRecycler.smoothScrollToPosition(getAdapterPosition());
}
}
}
}
P.S: I am new to programming any kind of help is appreciated.[As you can see in the image below that I have cards in the main view and the same options are in the drawer menu for example question papers. Now when the user clicks on question paper in the main view the question paper in drawer menu should get selected.[][1]][1]
thank you!
[1]: https://i.stack.imgur.com/FooVb.jpg
I am new to android and java. I am not able to call ViewHolder.setCategoryName(name); in the onBindViewHolder function. I know there are probably similar questions but nothing has worked for me yet. The compiler gives error "non-static functions cannot be called from a static context", I haven't used static keyword anywhere in my code.
public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.ViewHolder> {
private List<CategoryModel> categoryModelList;
public CategoryAdapter(List<CategoryModel> categoryModelList) {
this.categoryModelList = categoryModelList;
}
#NonNull
#Override
public CategoryAdapter.ViewHolder onCreateViewHolder(#NonNull ViewGroup viewGroup, int position) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.category_item,viewGroup,false);
return new ViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull CategoryAdapter.ViewHolder holder, int position) {
String icon = categoryModelList.get(position).getCategoryIconLink();
String name = categoryModelList.get(position).getCategoryName();
ViewHolder.setCategoryName(name);
}
#Override
public int getItemCount() {
return categoryModelList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
private ImageView categoryIcon;
private TextView categoryName;
public ViewHolder(#NonNull View itemView) {
super(itemView);
categoryIcon = itemView.findViewById(R.id.category_icon);
categoryName = itemView.findViewById(R.id.category_name);
}
private void setCategoryIcon(){
}
private void setCategoryName(String name){
categoryName.setText(name);
}
}
}
The problem is that your method isn't static but you are trying to call from a static context:
private void setCategoryName
You would need to do:
private static void setCategoryName
However, for this type of action, you can just use the holder variable:
holder.bind(categoryModelList.get(position))
try this:
public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.ViewHolder> {
private List<CategoryModel> categoryModelList;
public CategoryAdapter(List<CategoryModel> categoryModelList) {
this.categoryModelList = categoryModelList;
}
#NonNull
#Override
public CategoryAdapter.ViewHolder onCreateViewHolder(#NonNull ViewGroup viewGroup, int position) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.category_item,viewGroup,false);
return new ViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull CategoryAdapter.ViewHolder holder, int position) {
holder.bind(categoryModelList.get(position))
}
#Override
public int getItemCount() {
return categoryModelList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
private ImageView categoryIcon;
private TextView categoryName;
public ViewHolder(#NonNull View itemView) {
super(itemView);
categoryIcon = itemView.findViewById(R.id.category_icon);
categoryName = itemView.findViewById(R.id.category_name);
}
public void bind(CategoryModel categoryModel){
categoryName.setText(categoryModel.getCategoryName());
}
}
}
public abstract class BaseAdapters extends RecyclerView.Adapter<BaseAdapters.MyViewHolder> implements View.OnClickListener {
protected Context parentContext;
public int layout_id;
protected List<?> dataList = new ArrayList<>();
public class MyViewHolder extends RecyclerView.ViewHolder {
MyViewHolder(View view) {
super(view);
declareViews(view,this);
}
}
#Override
public void onClick(View view) {
onClickViews(view);
}
#Override
public int getItemViewType(int position) {
return position;
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public void onBindViewHolder(#NonNull MyViewHolder holder, int i) {
bindView(holder, i);
}
public void notifyList(List<?> filterdNames) {
this.dataList = filterdNames;
notifyDataSetChanged();
}
#Override
public int getItemCount() {
if (dataList.size() == 0)
return 5;
else
return dataList.size();
}
#NonNull
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int i) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(layout_id, parent, false);
return new MyViewHolder(itemView);
}
public abstract MyViewHolder bindView(MyViewHolder holder, int position);
public abstract void onClickViews(View view);
public abstract void declareViews(View view,MyViewHolder holder);
}
How can i perform on click of every item selection using holder in child class extending with it.
import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.MyViewHolder> {
public int layout_id;
protected List<?> dataList = new ArrayList<>();
Context BASE_CONTEXT;
public View itemview;
public BaseAdapter(Context context) {
this.BASE_CONTEXT = context;
}
#NonNull
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(layout_id, viewGroup, false);
return new MyViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull MyViewHolder viewHolder, int position) {
onBindViewHold(position, dataList.get(position));
}
public abstract View getView(View view);
#Override
public int getItemCount() {
return dataList.size() == 0 ? 0 : dataList.size();
}
public abstract void onBindViewHold(int position, Object itemView);
class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(#NonNull View itemView) {
super(itemView);
itemview = itemView;
getView(itemView);
}
}
public <T extends View> T bind(int id) {
return itemview.findViewById(id);
}
}
public class Adapter extends BaseAdapter {
TextView tv;
Adapter(Context context, ArrayList<String> arrayList){
super(context);
dataList=arrayList;
layout_id=R.layout.content_main2;
}
#Override
public View getView(View view) {
tv = bind(R.id.tv);
return view;
}
#Override
public void onBindViewHold( final int position, Object itemView) {
String text=(String) itemView;
Log.e("tv",tv.toString());
tv.setText(text);
tv.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Toast.makeText(BASE_CONTEXT, ""+position, Toast.LENGTH_SHORT).show();
}
});
}
}
You can refer this sample adapter class and edit it as per your requirement:
public class absadapter extends RecyclerView.Adapter<absadapter.exViewHolder> {
List<abs.Ex> exList;
Context context;
absadapter(List exList) {
this.exList= exList;
}
public static class exViewHolder extends RecyclerView.ViewHolder{
CardView cardView;
TextView exname;
ImageView exlogo;
exViewHolder(View itemView){
super(itemView);
cardView= itemView.findViewById(R.id.cardView);
exname= itemView.findViewById(R.id.ex_name);
exlogo=itemView.findViewById(R.id.exlogo);
}
}
#Override
public absadapter.exViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View viewthigh= LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_abslayout,parent,false);
absadapter.exViewHolder evh=new absadapter.exViewHolder(viewthigh);
return evh;
}
#Override
public void onBindViewHolder(final absadapter.exViewHolder holder, final int position){
holder.exname.setText(exList.get(position).name);
holder.exlogo.setImageResource(exList.get(position).logoId);
holder.itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (position == 0 ){
v.getContext().startActivity(new Intent(v.getContext(), abdetails.class));
}
if (position == 1) {
v.getContext().startActivity(new Intent(v.getContext(), declinecrunch.class));
}
if (position == 2) {
v.getContext().startActivity(new Intent(v.getContext(), dumsidebend.class));
}
}
});
}
#Override
public void onAttachedToRecyclerView(RecyclerView recyclerView){
super.onAttachedToRecyclerView(recyclerView);
}
#Override
public int getItemCount() {
return exList.size();
}
Refer this for Main Class:
public class abs extends AppCompatActivity {
RecyclerView recyclerView;
Context context;
private List<Ex> exlist;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_abs);
recyclerView= findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager=new LinearLayoutManager(context);
recyclerView.setLayoutManager(layoutManager);
initializeData();
initializeAdapter();
}
private void initializeData(){
exlist=new ArrayList<>();
exlist.add(new abs.Ex("Crunches",R.drawable.crunchesgif));
exlist.add(new abs.Ex("Decline Crunch",R.drawable.declinecrunch));
exlist.add(new abs.Ex("Dumbell Side Bends",R.drawable.dumbbellsidebend));
exlist.add(new abs.Ex("Hanging Leg Raises",R.drawable.hanginglegraises));
exlist.add(new abs.Ex("Incline Leg Raises",R.drawable.inclinelegraises));
exlist.add(new abs.Ex("Kneeling Cable Crunch",R.drawable.cablecrunch));
exlist.add(new abs.Ex("Legs Raises",R.drawable.legraises));
exlist.add(new abs.Ex("Flat Bench Lying Leg Raises",R.drawable.flatbenchlyinglegraise));
exlist.add(new abs.Ex("Seated Jack Knife",R.drawable.seatedjackknife));
exlist.add(new abs.Ex("Twisting Hip Raise",R.drawable.twistinghipraise));
exlist.add(new abs.Ex("Weighted Crunch",R.drawable.weightedcrunch));
exlist.add(new abs.Ex("Plank",R.drawable.plank));
exlist.add(new abs.Ex("Side Plank",R.drawable.sideplank));
exlist.add(new abs.Ex("Superman",R.drawable.superman));
exlist.add(new abs.Ex("Twist Crunch",R.drawable.twistcrunch));
}
public void initializeAdapter(){
absadapter rvadapter=new absadapter(exlist);
recyclerView.setAdapter(rvadapter);
}
class Ex{
String name;
int logoId;
Ex(String name,int logoId){
this.name=name;
this.logoId=logoId;
}
}
This is extend version of rupali answer, i found recycle issue on recycle-view viewholder while scrolling on items. so if needed you can use below one,
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseRecyclerViewAdapter extends RecyclerView.Adapter<BaseRecyclerViewAdapter.BaseViewHolder> {
public int layout_id;
protected List<?> dataList = new ArrayList<>();
protected BaseActivity Context;
public BaseRecyclerViewAdapter(BaseActivity context) {
this.Context = context;
}
#NonNull
#Override
public BaseViewHolder onCreateViewHolder(#NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(layout_id, viewGroup, false);
return new BaseViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull BaseViewHolder viewHolder, int position) {
onViewHolderBind(viewHolder,position, dataList.get(position));
}
#Override
public int getItemCount() {
return dataList.size();
}
public abstract void onViewHolderBind(BaseViewHolder viewHolder, int position, Object data);
public class BaseViewHolder extends RecyclerView.ViewHolder {
public BaseViewHolder(#NonNull View itemView) {
super(itemView);
}
}
}
Uses
public class LicenseListAdapter extends BaseRecyclerViewAdapter {
public LicenseListAdapter(BaseActivity appLicensePlanActivity, List<LicenseRatePlanResponse> licenseRatePlanResponseData) {
super(appLicensePlanActivity);
dataList = licenseRatePlanResponseData;
layout_id = R.layout.item_list_license_plan;
}
#Override
public void onViewHolderBind(BaseViewHolder viewHolder, int position, Object data) {
Button btnBuyButtonOfLicencePlaneILLP;
TextView lblAmountOfLicencePlaneILLP, lblDayOfLicencePlaneILLP;
lblAmountOfLicencePlaneILLP = viewHolder.itemView.findViewById(R.id.lblAmountOfLicencePlaneILLP);
lblDayOfLicencePlaneILLP = viewHolder.itemView.findViewById(R.id.lblDayOfLicencePlaneILLP);
btnBuyButtonOfLicencePlaneILLP = viewHolder.itemView.findViewById(R.id.btnBuyButtonOfLicencePlaneILLP);
final LicenseRatePlanResponse tempLicensePlan = (LicenseRatePlanResponse) data;
lblAmountOfLicencePlaneILLP.setText(KSUtility.GetFloatWithOutPrecesion(tempLicensePlan.getAmount()).toString() +" only");
lblDayOfLicencePlaneILLP.setText(tempLicensePlan.getValidityDays().toString() +" days");
btnBuyButtonOfLicencePlaneILLP.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
PaymentHelper.OpenPaymentDialog(Context, TransactionType.LicenseRenew, tempLicensePlan.getAmount(),tempLicensePlan.getLicenseRatePlanId());
}
});
}
}
overriding the method which handles click events in sub-classes of "BaseAdapters" should do it( based on your comments on other posts i assume bindView() handles click events; override whichever method you know handles click events):
class new_adapter extends BaseAdapters{
//...
#Override
public MyViewHolder bindView(MyViewHolder holder, int position){
//you could alter how click events are handled here.
}
//...
}
There can be many ways, one of them is, you can use Java Generics.
Set click in your onCreateViewHolder, set click and pass your list item of clicked row, or anything you need. You can customize method onClickViews if you need position or anyother field.
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int position) {
..
itemView.setOnClickListener(v -> onClickViews(itemView, dataList.get(position)));
..
}
and
public abstract void onClickViews(View view, T object);
Use like
public class SampleAdapter extends BaseAdapters<Item> {
#Override
public int getRowLayout() {
return R.layout.row;
}
#Override
public void onClickViews(View view, Item object) {
// row clicked
}
}
I edited your class a bit.
public abstract class BaseAdapters<T> extends RecyclerView.Adapter<BaseAdapters.MyViewHolder> {
protected List<T> dataList = new ArrayList<>();
public class MyViewHolder extends RecyclerView.ViewHolder {
MyViewHolder(View view) {
super(view);
declareViews(view, this);
}
}
#Override
public void onBindViewHolder(#NonNull MyViewHolder holder, int i) {
bindView(holder, i);
}
public void notifyList(List<T> filteredNames) {
dataList = filteredNames;
notifyDataSetChanged();
}
#Override
public int getItemCount() {
return dataList.size();
}
#NonNull
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int position) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(getRowLayout(), parent, false);
itemView.setOnClickListener(v -> onClickViews(itemView, dataList.get(position)));
return new MyViewHolder(itemView);
}
public abstract #LayoutRes
int getRowLayout();
public abstract MyViewHolder bindView(MyViewHolder holder, int position);
public abstract void onClickViews(View view, T object);
public abstract void declareViews(View view, MyViewHolder holder);
}
The Base Recycler Adapter will be like this
public class BaseRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int BOTTOM_VIEW_TYPE = 3;
private List<Object> listModels;
private Context mContext;
private OnItemClickListener onClickListener = null;
public BaseRecyclerViewAdapter(Context context) {
this.mContext = context;
}
#Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case BOTTOM_VIEW_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_bottomview_type, parent, false);
return new ChildViewHolder(view);
}
return null;
}
#Override
public void onBindViewHolder(#NonNull RecyclerView.ViewHolder holder, int position) {
final Object model = listModels.get(position);
if (model != null && model.getId() > 0) {
((BaseViewHolder) holder).bind(model, position);
} else if (model != null) {
((TopViewViewHolder) holder).bind(model, position);
}
}
#Override
public int getItemViewType(int position) {
if (listModels.get(position).getId() > 0) {
return BASE_VIEW_TYPE;
} else {
return TOP_VIEW_TYPE;
}
}
#Override
public int getItemCount() {
return null == listModels ? 0 : listModels.size();
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onClickListener = onItemClickListener;
}
private class ChildViewHolder extends RecyclerView.ViewHolder {
TextView tv_bottomName;
BottomViewHolder(View v) {
super(v);
tv_bottomName = v.findViewById(R.id.tv_bottomName);
}
void bind(Object object, final int position) {
tv_bottomName.setOnClickListener(view -> onClickListener.onItemClick(object, tv_bottomName, position));
}
}
}
And use a Custom interface for OnItemClickListner
public interface OnItemClickListener {
void onItemClick(Object object, View view, int position);}
And Implement the listner in activity or fragment
i am trying to inflate two different layouts in one recycler view. Here is my adapter code.
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<myHome> homeData;
private static final int TYPE_FEATURED = 1;
private static final int TYPE_OTHER = 2;
public HomeAdapter(ArrayList<myHome> myDataset) {
this.homeData = myDataset;
}
public class FeaturedViewHolder extends RecyclerView.ViewHolder {
public TextView title;
public TextView author;
public FeaturedViewHolder(View itemView) {
super(itemView);
this.title = (TextView)itemView.findViewById(R.id.title);
this.author = (TextView)itemView.findViewById(R.id.recvid_auth);
}
}
public class otherVidViewHolder extends RecyclerView.ViewHolder {
public TextView rec_title;
public TextView rec_author;
public otherVidViewHolder(View itemView) {
super(itemView);
this.rec_title = (TextView)itemView.findViewById(R.id.recvid_title);
this.rec_author = (TextView)itemView.findViewById(R.id.description);
}
}
#Override
public int getItemViewType(int position) {
// Just as an example, return 0 or 2 depending on position
// Note that unlike in ListView adapters, types don't have to be contiguous
return (position == 0? TYPE_FEATURED : TYPE_OTHER);
}
#Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
RecyclerView.ViewHolder viewHolder;
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
switch (viewType) {
case TYPE_FEATURED :
View v1 = inflater.inflate(R.layout.layout_home_view, viewGroup, false);
viewHolder = new FeaturedViewHolder(v1);
//return new FeaturedViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_home_view, viewGroup, false));
break;
case TYPE_OTHER :
View v2 = inflater.inflate(R.layout.layout_home_other, viewGroup, false);
viewHolder = new otherVidViewHolder(v2);
//return new otherVidViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_home_other, viewGroup, false));
break;
default: return null;
}
return viewHolder;
}
#Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
if(viewHolder.getItemViewType() == TYPE_FEATURED) {
FeaturedViewHolder featuredViewHolder = (FeaturedViewHolder) viewHolder;
featuredViewHolder.title.setText(homeData.get(i).getTitle());
featuredViewHolder.author.setText(homeData.get(i).getUser());
} else {
otherVidViewHolder otherViewHolder = (otherVidViewHolder) viewHolder;
otherViewHolder.rec_title.setText(homeData.get(i).getViews());
}
}
#Override
public int getItemCount() {
return homeData.size();
}
the code is running properly but it only shows one layout, the other layout which is the layout_home_other is not showing. is it possible to show the two layouts? the two layouts also have different datas to show. how will i retun the size of the second layout in getItemCount() also? thank you for all the help i will get.
here is the dataset.
public class myHome {
String title;
String user;
String views;
String url;
String duration;
public myHome(String title, String user, String views, String url, String duration) {
this.title = title;
this.user = user;
this.views = views;
this.url = url;
this.duration = duration;
}
public String getTitle() {
return title;
}
public String getUser() {
return user;
}
public String getViews() {
return views;
}
public String getUrl() {
return url;
}
public String getDuration() {
return duration;
}
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// CONSTRUCTOR
public RecyclerViewAdapter(Context context,"OTHER PARAMETERS) {
this.context = context;
}
#Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view ;
switch (viewType){
case -1:
view = inflater.inflate(R.layout.LAYOUTONE, null, false);
return new ExpiredViewHolder(view);
case 0:
view = inflater.inflate(R.layout.LAYOUTTWO, null, false);
return new ActiveViewHolder(view);
}
}
#Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ExpiredViewHolder) {
((ExpiredViewHolder) holder).bind(tickerList.get(position));
} else {
if (holder instanceof ActiveViewHolder) {
((ActiveViewHolder) holder).bind(tickerList.get(position));
}
else {
((FutureViewHolder) holder).bind(tickerList.get(position));
}
}
}
#Override
public int getItemViewType(int position) {
return List.get(position).status;
}
#Override
public int getItemCount() {
return List.size();
}
static class ActiveViewHolder extends RecyclerView.ViewHolder {
//Your layout components
public ActiveViewHolder(View view) {
super(view);
//Instantiate you layout components fromyout view
}
public void bind(Params) {
//PUT TEXT TO YOUR FIELDS OR COMPONENTS
}
}
class ExpiredViewHolder extends RecyclerView.ViewHolder {
public ExpiredViewHolder(View view) {
super(view);
}
public void bind(Params) {
}
}
static class FutureViewHolder extends RecyclerView.ViewHolder {
public FutureViewHolder( View view) {
super(view);
}
public void bind(Params) {
}
}
}
public class MainClass{
RecyclerView mRecyclerView ;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new RecyclerViewAdapter(getActivity(), arrayTicker);
mRecyclerView.setAdapter(adapter);
return view;
}
}
I tried to insert recycleview inside cardview, but it not create it. I think it's problem with adapter, because this type of card created, but not fill recycle view.Now its look like this
There's my recycleview adapter code
public class SubItemsAdapter extends RecyclerView.Adapter<SubItemsAdapter.SubtasksViewHolder>{
private List<Subtask> subtasks;
public SubItemsAdapter(List<Subtask> subtasks){
this.subtasks = subtasks;
}
public class SubtasksViewHolder extends RecyclerView.ViewHolder{
TextView titleTextView;
CheckBox doneCheckBox;
public SubtasksViewHolder(View itemView) {
super(itemView);
titleTextView = (TextView)itemView.findViewById(R.id.subtaskTitle);
doneCheckBox = (CheckBox)itemView.findViewById(R.id.subtaskCheckbox);
}
}
#Override
public SubtasksViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.subtasks_listitem,parent,false);
return new SubtasksViewHolder(v);
}
#Override
public void onBindViewHolder(SubtasksViewHolder holder, int position) {
holder.titleTextView.setText(subtasks.get(position).getText());
holder.doneCheckBox.setChecked(subtasks.get(position).getDone());
}
#Override
public int getItemCount() {
return subtasks.size();
}} `
And my cardview code:
public class TasklistAdapter extends RecyclerView.Adapter<TasklistAdapter.ViewHolder> {
ArrayList<TodoItem> todoItems;
int[] dataTypes;
private static final int SIMPLETODOITEM = 0;
private static final int EXTENDTODOITEM = 1;
Context context;
public TasklistAdapter(ArrayList<TodoItem> todoItems, int[] dataTypes, Context context)
{
this.todoItems = todoItems;
this.dataTypes = dataTypes;
this.context = context;
}
public class SimpleViewHolder extends ViewHolder{
TextView titleTextView;
TextView desciptionTextView;
CheckBox doneCheckBox;
public SimpleViewHolder(View v) {
super(v);
titleTextView = (TextView)v.findViewById(R.id.simpleitem_title_textbox);
desciptionTextView =(TextView)v.findViewById(R.id.simpleitem_description_textbox);
doneCheckBox = (CheckBox)v.findViewById(R.id.simpleitem_checkbox);
}
}
public class ExtendViewHolder extends ViewHolder{
TextView titleTextView;
TextView descTextView;
RecyclerView subtasksListView;
SubItemsAdapter adapter;
RecyclerView.LayoutManager manager;
public ExtendViewHolder(View v) {
super(v);
titleTextView = (TextView)v.findViewById(R.id.extended_card_title);
descTextView = (TextView)v.findViewById(R.id.extended_card_description);
subtasksListView = (RecyclerView)v.findViewById(R.id.subtasks_listview);
manager = new LinearLayoutManager(v.getContext());
}
}
#Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v;
switch (viewType)
{
case EXTENDTODOITEM:
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.extendedtodoitem_card, parent, false);
return new ExtendViewHolder(v);
default:
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.simpletodoitem_card,parent,false);
return new SimpleViewHolder(v);
}
}
#Override
public void onBindViewHolder(ViewHolder holder, int position) {
switch (holder.getItemViewType()){
case EXTENDTODOITEM:
ExtendViewHolder extViewHold = (ExtendViewHolder)holder;
extViewHold.adapter = new SubItemsAdapter(todoItems.get(position).getSubtasks());
extViewHold.titleTextView.setText(todoItems.get(position).getText());
extViewHold.descTextView.setText(todoItems.get(position).getDescription());
extViewHold.subtasksListView.setLayoutManager(extViewHold.manager);
extViewHold.subtasksListView.setAdapter(extViewHold.adapter);
break;
default:
SimpleViewHolder simViewHold = (SimpleViewHolder)holder;
simViewHold.desciptionTextView.setText(todoItems.get(position).getDescription());
simViewHold.titleTextView.setText(todoItems.get(position).getText());
break;
}
}
#Override
public int getItemCount() {
return todoItems.size();
}
#Override
public int getItemViewType(int position) {
return dataTypes[position];
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View v) {
super(v);
}
}
}`
in your TasklistAdapter, static class ViewHolder extending RecyclerView.ViewHolder seems useless! and you are trying to inflate and bind data with two heterogeneous layouts with their own viewholder sub-classes! My solution would be to change this :
public class TasklistAdapter extends RecyclerView.Adapter<TasklistAdapter.ViewHolder>
to
public class TasklistAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>