I have a problem with my android app.
I have a RecyclerView and a click handler for it. When you click on a list item, one of the class fields is displayed on the screen. Also inside there is a button, by clicking on which another class field should be displayed. But the program throws a NullPointerException. I understand why this is happening, but I cannot understand how to modify my code, please help.
here is my Adapeter
package com.skorbr.stock_yandextest;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class TickerAdapter extends RecyclerView.Adapter<TickerAdapter.TickerViewHolder> {
private List<Ticker> tickers;
private Context context;
// listener
private final Listener onTickerClickListener;
// constructor
public TickerAdapter(List<Ticker> tickers, Listener onTickerClickListener) {
this.tickers = tickers;
this.onTickerClickListener = onTickerClickListener;
}
#NonNull
#Override
public TickerViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
context = parent.getContext();
View view = LayoutInflater.from(context).inflate(R.layout.recycler_stock_item, parent, false);
// click on RecyclerView
view.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
onTickerClickListener.onTickerClick((Ticker) v.getTag());
}
});
// click on button
view.findViewById(R.id.button_favourite).setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
onTickerClickListener.onFavouriteClick((Ticker) v.getTag());
}
});
return new TickerViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull TickerViewHolder holder, int position) {
Ticker ticker = tickers.get(position);
holder.bind(ticker);
holder.itemView.setTag(ticker);
}
#Override
public int getItemCount() {
return tickers.size();
}
class TickerViewHolder extends RecyclerView.ViewHolder {
private TextView ticker;
private TextView tickerFull;
private TextView price;
private TextView priceChange;
private ImageView tickerLogo;
private Button favouriteButton;
public TickerViewHolder(#NonNull final View itemView) {
super(itemView);
ticker = itemView.findViewById(R.id.ticker);
tickerFull = itemView.findViewById(R.id.ticker_full);
price = itemView.findViewById(R.id.price);
priceChange = itemView.findViewById(R.id.price_change);
tickerLogo = itemView.findViewById(R.id.ticker_image);
favouriteButton = itemView.findViewById(R.id.button_favourite);
}
// заполнение элемента RecyclerView данными
void bind(Ticker ticker) {
double priceNow = ticker.getPrice();
double priceDayAgo = ticker.getPriceDayAgo();
String sign = "";
this.ticker.setText(ticker.getTicker());
this.tickerFull.setText(ticker.getTickerFull());
this.price.setText("$" + priceNow);
// check price
if (priceNow < priceDayAgo) {
sign = "-";
this.priceChange.setTextColor(context.getResources().getColor(R.color.colorRedDm));
} else if (priceNow > priceDayAgo) {
sign = "+";
this.priceChange.setTextColor(context.getResources().getColor(R.color.colorGreenDm));
}
// check favourites
if (ticker.isFavourite()) {
this.favouriteButton.setBackground(context.getDrawable(R.drawable.ic_favourite_on));
} else {
this.favouriteButton.setBackground(context.getDrawable(R.drawable.ic_favourite_off));
}
this.priceChange.setText(String.format("%s$%.2f (%.2f%%)", sign, Math.abs(priceNow-priceDayAgo), Math.abs(priceNow/priceDayAgo*100-100)));
this.tickerLogo.setImageResource(ticker.getTickerLogo());
}
}
interface Listener {
void onTickerClick(Ticker ticker);
void onFavouriteClick(Ticker ticker);
}
}
Here is my Main Activity
package com.skorbr.stock_yandextest;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class ActivityMain extends Activity {
private RecyclerView tickerList;
private TickerAdapter tickerAdapter;
private List<Ticker> tickerListList;
#Override
protected void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tickerListList = tickerList();
tickerList = findViewById(R.id.tickers_list);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
tickerList.setLayoutManager(layoutManager);
tickerAdapter = new TickerAdapter(tickerListList, new TickerAdapter.Listener() {
#Override
public void onTickerClick(Ticker ticker) {
Toast.makeText(ActivityMain.this, ticker.getTickerFull(), Toast.LENGTH_SHORT);
}
#Override
public void onFavouriteClick(Ticker ticker) {
Toast.makeText(ActivityMain.this, ticker.getTicker(), Toast.LENGTH_SHORT);
}
});
tickerList.setAdapter(tickerAdapter);
}
private List<Ticker> tickerList() {
List<Ticker> tickers = new ArrayList<>();
tickers.add(new Ticker("APPL", "Apple Inc.", 138.54, 150.22, R.drawable.apple_logo, false));
tickers.add(new Ticker("TSLA", "Tesla Motors", 904.37, 753.92, R.drawable.tesla_logo, true));
tickers.add(new Ticker("GOOGL", "Alphabel Class A", 1845.90, 1845.90, R.drawable.google_logo, false));
return tickers;
}
}
Here is my class for data
package com.skorbr.stock_yandextest;
public class Ticker {
private String ticker;
private String tickerFull;
private double price;
private double priceDayAgo;
private int tickerLogo;
private boolean isFavourite;
public Ticker(String ticker, String tickerFull, double price, double priceDayAgo, int tickerLogo, boolean isFavourite) {
this.ticker = ticker;
this.tickerFull = tickerFull;
this.price = price;
this.priceDayAgo = priceDayAgo;
this.tickerLogo = tickerLogo;
this.isFavourite = isFavourite;
}
public String getTicker() {
return ticker;
}
public String getTickerFull() {
return tickerFull;
}
public double getPrice() {
return price;
}
public double getPriceDayAgo() {
return priceDayAgo;
}
public int getTickerLogo() {
return tickerLogo;
}
public boolean isFavourite() {
return isFavourite;
}
public void setFavourite(boolean favourite) {
isFavourite = favourite;
}
}
#Override
public void onBindViewHolder(#NonNull TickerViewHolder holder, int position) {
Ticker ticker = tickers.get(position);
holder.bind(ticker);
holder.itemView.setTag(ticker);
// add this line
holder.favouriteButton.setTag(ticker);
}
Or you can modify the onCreateViewHolder()
view.findViewById(R.id.button_favourite).setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// instead of
onTickerClickListener.onFavouriteClick((Ticker) v.getTag());
// use
onTickerClickListener.onFavouriteClick((Ticker) view.getTag());
}
});
Related
This question already has an answer here:
Firebase Android ListView not being displayed
(1 answer)
Closed 1 year ago.
I am creating an Android Grocery Shop App, where firestore used. I am implementing a Nested Recyclerview where I have done coding for showing data from firestore to recycler view by Category Names.
But, all products are showing in the recyclerview, like the below image. Data is not sorted by category names.
Codes
ProductsAdapterbyCategory.java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.chattthedev.shoppingguskara.Activities.Models.ProductsModel;
import com.chattthedev.shoppingguskara.R;
import java.util.List;
public class ProductsAdapterbyCategory extends
RecyclerView.Adapter<ProductsAdapterbyCategory.ViewHolderForProducts> {
List<ProductsModel> productsbycat;
Context context;
public ProductsAdapterbyCategory(List<ProductsModel> productsbycat, Context context) {
this.productsbycat = productsbycat;
this.context = context;
}
#NonNull
#Override
public ViewHolderForProducts onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.singleforitembycat, parent, false);
ViewHolderForProducts viewHolderForProducts = new ViewHolderForProducts(view);
return viewHolderForProducts;
}
#Override
public void onBindViewHolder(#NonNull ViewHolderForProducts holder, int position) {
holder.catnameinprod.setText(productsbycat.get(position).getItemCategory());
ProductsAdapter2 productsAdapter2 = new ProductsAdapter2(productsbycat, context);
holder.recyclerViewinprod.setHasFixedSize(true);
holder.recyclerViewinprod.setLayoutManager(new LinearLayoutManager(context, RecyclerView.HORIZONTAL, false));
holder.recyclerViewinprod.setAdapter(productsAdapter2);
holder.recyclerViewinprod.setNestedScrollingEnabled(false);
}
#Override
public int getItemCount() {
return (productsbycat != null ? productsbycat.size() : 0);
}
public class ViewHolderForProducts extends RecyclerView.ViewHolder {
public TextView catnameinprod;
public Button viewmoreinprod;
public RecyclerView recyclerViewinprod;
public ViewHolderForProducts(#NonNull View itemView) {
super(itemView);
catnameinprod = itemView.findViewById(R.id.catnameforfetch);
viewmoreinprod = itemView.findViewById(R.id.buttviewmoreitem);
recyclerViewinprod = itemView.findViewById(R.id.recyclerprodfetch);
}
}
}
ProductsAdapter.java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.chattthedev.shoppingguskara.Activities.Models.ProductsModel;
import com.chattthedev.shoppingguskara.R;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
public class ProductsAdapter2 extends RecyclerView.Adapter {
List<ProductsModel> productsModelList;
Context context;
public ProductsAdapter2(List<ProductsModel> productsModelList, Context context) {
this.productsModelList = productsModelList;
this.context = context;
}
#NonNull
#Override
public RecyclerView.ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.horizontal_scroll_item, parent, false);
ProductsAdapter2.ViewHolderClass2 viewHolderClass = new ProductsAdapter2.ViewHolderClass2(view);
return viewHolderClass;
}
#Override
public void onBindViewHolder(#NonNull RecyclerView.ViewHolder holder, int position) {
ProductsAdapter2.ViewHolderClass2 viewHolderClass = (ProductsAdapter2.ViewHolderClass2) holder;
ProductsModel productsModel = productsModelList.get(position);
viewHolderClass.proditemname.setText(productsModel.getItemname());
viewHolderClass.proditemprice.setText("Rs." + productsModel.getItemActualPrice() + "/-");
Picasso.get().load(productsModel.getItemImageUrl()).into(viewHolderClass.prodimage);
}
public void updatelist(List<ProductsModel> models){
productsModelList = new ArrayList<>();
productsModelList.addAll(models);
notifyDataSetChanged();
}
public Filter getFilter(){
return new Filter() {
private List<ProductsModel> filtered = new ArrayList<ProductsModel>();
#Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString().toLowerCase();
filtered.clear();
if(charString.isEmpty()){
filtered = productsModelList;
//filteredCUG = CUG;
}
else{
for (ProductsModel cug : productsModelList){
if( cug.getItemname().toLowerCase().contains(charString)){
filtered.add(cug);
}
}
//filteredCUG = filtered;
}
FilterResults filterResults = new FilterResults();
filterResults.values = filtered;
return filterResults;
}
#Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
productsModelList = (List<ProductsModel>) filterResults.values;
notifyDataSetChanged();
}
};
}
#Override
public int getItemCount() {
return productsModelList.size();
}
public class ViewHolderClass2 extends RecyclerView.ViewHolder {
TextView proditemname, proditemprice, productitemdiscount;
ImageView prodimage;
public ViewHolderClass2(#NonNull View itemView) {
super(itemView);
proditemname = itemView.findViewById(R.id.hsproducttitle);
proditemprice = itemView.findViewById(R.id.hsproductprice);
prodimage = itemView.findViewById(R.id.hsproductimage);
productitemdiscount = itemView.findViewById(R.id.hsproductdesc);
}
}
}
HomeFragment.java only providing the recyclerview fetching data function from firestore
private void getproductsfromcats() {
Query query = collectionReference.orderBy("ItemCategory");
query.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
#Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot queryDocumentSnapshot : queryDocumentSnapshots) {
ProductsModel productsModel = queryDocumentSnapshot.toObject(ProductsModel.class);
productsModelList2.add(productsModel);
}
productsAdapterbyCategory = new
ProductsAdapterbyCategory(productsModelList2,view.getContext());
product_items_for_cat.setAdapter(productsAdapterbyCategory);
}
}).addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception e) {
Toast.makeText(view.getContext(), "Failed", Toast.LENGTH_SHORT).show();
}
});
}
ProductsModel.java
public class ProductsModel {
private String ItemActualPrice, ItemCategory, ItemDescription, ItemDiscount,
ItemFinalPrice, ItemId, ItemImageUrl, ItemStock, ItemUnit, ItemWeight,
Itemname;
public ProductsModel() {
}
public ProductsModel(String itemActualPrice, String itemCategory, String
itemDescription, String itemDiscount, String itemFinalPrice, String itemId,
String itemImageUrl, String itemStock, String itemUnit, String itemWeight,
String itemname) {
ItemActualPrice = itemActualPrice;
ItemCategory = itemCategory;
ItemDescription = itemDescription;
ItemDiscount = itemDiscount;
ItemFinalPrice = itemFinalPrice;
ItemId = itemId;
ItemImageUrl = itemImageUrl;
ItemStock = itemStock;
ItemUnit = itemUnit;
ItemWeight = itemWeight;
Itemname = itemname;
}
public String getItemActualPrice() {
return ItemActualPrice;
}
public void setItemActualPrice(String itemActualPrice) {
ItemActualPrice = itemActualPrice;
}
public String getItemCategory() {
return ItemCategory;
}
public void setItemCategory(String itemCategory) {
ItemCategory = itemCategory;
}
public String getItemDescription() {
return ItemDescription;
}
public void setItemDescription(String itemDescription) {
ItemDescription = itemDescription;
}
public String getItemDiscount() {
return ItemDiscount;
}
public void setItemDiscount(String itemDiscount) {
ItemDiscount = itemDiscount;
}
public String getItemFinalPrice() {
return ItemFinalPrice;
}
public void setItemFinalPrice(String itemFinalPrice) {
ItemFinalPrice = itemFinalPrice;
}
public String getItemId() {
return ItemId;
}
public void setItemId(String itemId) {
ItemId = itemId;
}
public String getItemImageUrl() {
return ItemImageUrl;
}
public void setItemImageUrl(String itemImageUrl) {
ItemImageUrl = itemImageUrl;
}
public String getItemStock() {
return ItemStock;
}
public void setItemStock(String itemStock) {
ItemStock = itemStock;
}
public String getItemUnit() {
return ItemUnit;
}
public void setItemUnit(String itemUnit) {
ItemUnit = itemUnit;
}
public String getItemWeight() {
return ItemWeight;
}
public void setItemWeight(String itemWeight) {
ItemWeight = itemWeight;
}
public String getItemname() {
return Itemname;
}
public void setItemname(String itemname) {
Itemname = itemname;
}
}
Firestore DB Structure Screenshot
you can create two different collection(meat,fruit) in firestore
I can't seems to find the issue for the problem that i have encounter that is when i navigate to ResidenceFrag fragment it will stop working after i have implemented recycle view into it. It was working fine with just fragments but after i have implemented recycle view, the view doesn't work anymore. Below are my files. Thank you.
ResidenceFrag.java
package com.example.ezhome;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
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.Collections;
import java.util.Comparator;
public class ResidenceFrag extends Fragment {
View v;
MHS mhs;
private RecyclerView recyclerView;
private ArrayList<Residence> resList;
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
v = inflater.inflate(R.layout.residence_frag, container, false);
mhs = new MHS();
resList = mhs.getResidences();
Collections.sort(resList, new Comparator<Residence>(){
#Override
public int compare(Residence r1, Residence r2){
return r1.getName().compareTo(r2.getName());
}
});
recyclerView = (RecyclerView) v.findViewById(R.id.rvItems);
ViewResidenceAdapter adapter = new ViewResidenceAdapter(getContext(),resList);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
return v;
}
}
MHS.java
package com.example.ezhome;
import java.util.ArrayList;
public class MHS {
public ArrayList<Residence> residences;
public Applicant applicant;
public MHS() {
setResidences(new ArrayList<Residence>());
residences.add(new Residence("ResB","A_address123",12,200,300,"micro1.jpg"));
residences.add(new Residence("ResA","B_address123",17,228,390,"micro2.jpg"));
}
public void submitApp(Application app){
applicant.addApplication(app);
}
public ArrayList<Residence> getResidences() {
return residences;
}
public void setResidences(ArrayList<Residence> residences) {
this.residences = residences;
}
}
Residence.java
package com.example.ezhome;
import java.util.ArrayList;
public class Residence {
private static int nextResidenceID = 1;
private String residenceID, address;
private int numUnits, i;
private double sizePerUnit, monthlyRental;
private ArrayList<Unit> units;
private String name;
private String image;
public Residence(String name, String address, int numUnits, double sizePerUnit, double monthlyRental, String image) {
setName(name);
setAddress(address);
setNumUnits(numUnits);
setSizePerUnit(sizePerUnit);
setMonthlyRental(monthlyRental);
setResidenceID();
setImage(image);
// setUnits(new ArrayList<Unit>());
// for(i = 0; i < numUnits; i++){
// Unit unit = new Unit(this);
// }
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static int getNextResidenceID() {
return nextResidenceID;
}
public static void setNextResidenceID(int nextResidenceID) {
Residence.nextResidenceID = nextResidenceID;
}
public String getResidenceID() {
return residenceID;
}
public void setResidenceID() {
this.residenceID = String.format("RES" + nextResidenceID++);
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getNumUnits() {
return numUnits;
}
public void setNumUnits(int numUnits) {
this.numUnits = numUnits;
}
public double getSizePerUnit() {
return sizePerUnit;
}
public void setSizePerUnit(double sizePerUnit) {
this.sizePerUnit = sizePerUnit;
}
public double getMonthlyRental() {
return monthlyRental;
}
public void setMonthlyRental(double monthlyRental) {
this.monthlyRental = monthlyRental;
}
public ArrayList<Unit> getUnits() {
return units;
}
public void setUnits(ArrayList<Unit> units) {
this.units = units;
}
public void addUnit(Unit unit) {
getUnits().add(unit);
}
}
ViewResidenceAdapter.java
package com.example.ezhome;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
public class ViewResidenceAdapter extends RecyclerView.Adapter<ViewResidenceAdapter.ViewHolder>{
private ArrayList<Residence> resList;
private Context context;
public ViewResidenceAdapter(Context context, ArrayList<Residence> resList){
this.context = context;
this.resList = resList;
}
#Override
public ViewResidenceAdapter.ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View inflater = LayoutInflater.from(context).inflate(R.layout.customlayout, parent, false);
ViewHolder viewHolder = new ViewHolder(inflater);
return viewHolder;
}
#Override
public void onBindViewHolder(#NonNull ViewResidenceAdapter.ViewHolder holder, int position) {
Residence res = resList.get(position);
try{
holder.nameTextView.setText(res.getName());
holder.sizeTextView.setText(res.getSizePerUnit() + " sqft");
holder.addressTextView.setText(res.getAddress());
holder.monthlyRentalTextView.setText("RM " + res.getMonthlyRental() + "/month");
holder.applyButton.setTag(res.getResidenceID());
String imageFile = res.getImage();
InputStream inputStream = context.getAssets().open(imageFile);
Drawable d = Drawable.createFromStream(inputStream, null);
holder.resImg.setImageDrawable(d);
} catch (IOException e){
e.printStackTrace();
}
}
public int getItemCount() {
return resList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView nameTextView;
public TextView sizeTextView;
public TextView addressTextView;
public TextView monthlyRentalTextView;
public ImageView resImg;
public Button applyButton;
public ViewHolder (View itemView){
super(itemView);
nameTextView = (TextView)itemView.findViewById(R.id.nameTextView);
sizeTextView = (TextView)itemView.findViewById(R.id.sizeTextView);
addressTextView = (TextView)itemView.findViewById(R.id.addressTextView);
monthlyRentalTextView = (TextView)itemView.findViewById(R.id.monthlyRentalTextView);
resImg = (ImageView)itemView.findViewById(R.id.resImg);
applyButton = (Button)itemView.findViewById(R.id.applyButton);
}
}
}
MainActivity.java
package com.example.ezhome;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private DrawerLayout drawer;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
R.string.nav_drawer_open, R.string.nav_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new HomeFrag()).commit();
navigationView.setCheckedItem(R.id.nav_home);
}
}
#Override
public boolean onNavigationItemSelected(#NonNull MenuItem item) {
if(item.getItemId() == R.id.nav_home){
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new HomeFrag()).commit();
} else if (item.getItemId() == R.id.nav_res){
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
new ResidenceFrag()).commit();
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
#Override
public void onBackPressed() {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
Solved: drawable image v24 issue
I knew my question is similar with the other questioners but it was not solved my problem because I am still curious about how to declare the item which is the children of parent node. This is my stucture data on my Firebase:
I've tried to created the classes for my case:
DolanIemClass.java
private String name_tourism;
private String location_tourism;
private String info_tourism;
private String telepon;
private String url_photo;
private String url_photo_collage;
private double lat_location_tourism;
private double lng_location_tourism;
public DolanItemClass() {
//constructor untuk panggilan ke DataSnapshot.getValue
}
public DolanItemClass(String name_tourism, String location_tourism, String info_tourism, String telepon, String url_photo, String url_photo_collage, double lat_location_tourism, double lng_location_tourism) {
this.name_tourism = name_tourism;
this.location_tourism = location_tourism;
this.info_tourism = info_tourism;
this.telepon = telepon;
this.url_photo = url_photo;
this.url_photo_collage = url_photo_collage;
this.lat_location_tourism = lat_location_tourism;
this.lng_location_tourism = lng_location_tourism;
}
public String getUrl_photo_collage() {
return url_photo_collage;
}
public String getName_tourism() {
return name_tourism;
}
public void setName_tourism(String name_tourism) {
this.name_tourism = name_tourism;
}
public String getLocation_tourism() {
return location_tourism;
}
public void setLocation_tourism(String location_tourism) {
this.location_tourism = location_tourism;
}
public String getInfo_tourism() {
return info_tourism;
}
public void setInfo_tourism(String info_tourism) {
this.info_tourism = info_tourism;
}
public String getTelepon() {
return telepon;
}
public void setTelepon(String telepon) {
this.telepon = telepon;
}
public String getUrl_photo() {
return url_photo;
}
public void setUrl_photo(String url_photo) {
this.url_photo = url_photo;
}
public double getLat_location_tourism() {
return lat_location_tourism;
}
public void setLat_location_tourism(double lat_location_tourism) {
this.lat_location_tourism = lat_location_tourism;
}
public double getLng_location_tourism() {
return lng_location_tourism;
}
public void setLng_location_tourism(double lng_location_tourism) {
this.lng_location_tourism = lng_location_tourism;
}
}
DolanViewHolder.class
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
public class DolanImageViewHolder extends RecyclerView.ViewHolder {
private final ImageView imgDetailData;
public DolanImageViewHolder(#NonNull View itemView) {
super(itemView);
imgDetailData = itemView.findViewById(R.id.img_detail_item_data);
}
public void showImageArray(DolanItemClass dolanItemClass){
Glide.with(itemView.getContext()).load(dolanItemClass.getUrl_photo_collage()).into(imgDetailData);
}
}
And the activity class to show the list
package co.id.roningrum.firebasearrayimage;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
public class DetailTouristListAct extends AppCompatActivity {
private ImageView imgDetailData;
private TextView tvNamaDetail, tvAlamatDetail, tvDescDetail;
private RecyclerView rvImageDetailCollages;
private DatabaseReference databaseReference;
private ValueEventListener valueEventListener;
private FirebaseRecyclerAdapter<DolanItemClass, DolanImageViewHolder> firebaseRecyclerAdapter;
public static final String EXTRA_WISATA_KEY = "tourist_key";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_tourist_list);
String touristKey = getIntent().getStringExtra(EXTRA_WISATA_KEY);
if(touristKey == null){
throw new IllegalArgumentException("Must pass Extra");
}
imgDetailData = findViewById(R.id.img_detail_data);
tvNamaDetail = findViewById(R.id.tv_name_detail);
tvAlamatDetail = findViewById(R.id.tv_info_tourism_detail);
tvDescDetail = findViewById(R.id.tv_address_detail);
rvImageDetailCollages = findViewById(R.id.rv_photo_collage);
databaseReference = FirebaseDatabase.getInstance().getReference().child("Tourism").child(touristKey);
rvImageDetailCollages.setLayoutManager(new GridLayoutManager(this, 2));
LoadDetailData();
}
private void ShowCollage() {
Query query = databaseReference.child("url_photo_collage");
FirebaseRecyclerOptions<DolanItemClass> options = new FirebaseRecyclerOptions.Builder<DolanItemClass>()
.setQuery(query, DolanItemClass.class)
.build();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<DolanItemClass, DolanImageViewHolder>(options) {
#Override
protected void onBindViewHolder(#NonNull DolanImageViewHolder dolanImageViewHolder, int i, #NonNull DolanItemClass dolanItemClass) {
dolanImageViewHolder.showImageArray(dolanItemClass);
}
#NonNull
#Override
public DolanImageViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
return new DolanImageViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image_data, parent, false));
}
};
firebaseRecyclerAdapter.notifyDataSetChanged();
rvImageDetailCollages.setAdapter(firebaseRecyclerAdapter);
}
private void LoadDetailData() {
ValueEventListener eventListener = new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
DolanItemClass dolanItemClass = dataSnapshot.getValue(DolanItemClass.class);
tvNamaDetail.setText(dolanItemClass.getName_tourism());
tvAlamatDetail.setText(dolanItemClass.getLocation_tourism());
tvDescDetail.setText(dolanItemClass.getInfo_tourism());
Glide.with(getApplicationContext()).load(dolanItemClass.getUrl_photo()).into(imgDetailData);
ShowCollage();
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
}
};
databaseReference.addValueEventListener(eventListener);
valueEventListener = eventListener;
}
#Override
protected void onStart() {
super.onStart();
LoadDetailData();
if(firebaseRecyclerAdapter!=null){
firebaseRecyclerAdapter.startListening();
}
}
#Override
protected void onStop() {
super.onStop();
databaseReference.removeEventListener(valueEventListener);
}
}
I expected that I can show the array of url_photo_collage node but I don't have any idea for my item class.
The problem in your code is that your url_photo_collage field is declared in your DolanItemClass class of type String while in your database is an array. To solve this, change the type of your field from String to a List<String> and get it accordingly in your adapter.
I want to display a bunch of custom markers(IconGenerator from com.google.maps.android:android-maps-utils:0.5) in a google map. But the data to build the markers, the LatLong location are in a firebase database, each child has its own location values, how can I read the location of each child and pass it to the class that will display the markers?
package com.realty.drake.kunuk;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.Keep;
import com.google.android.gms.maps.model.LatLng;
/**
* Created by drake on 5/1/18.
* This class is the model class
*/
#Keep
public class Property implements Parcelable {
private int price;
private String address;
private int numberOfBed;
private int numberOfBath;
private int numberOfCar;
private String propertyImage;
private float lotDim;
private String propertyDesc;
private float propertyDim;
private String lotTerrainType;
private String lotTerrainDimExt;
private String lotTerrainSteepness;
private LatLng location;
public Property() { } //Needed for Firebase's auto data mapping
public Property(int price, String address, int numberOfBed, int numberOfBath,
int numberOfCar, String propertyImage, float lotDim,
String propertyDesc, float propertyDim, String lotTerrainType,
String lotTerrainDimExt, String lotTerrainSteepness,
LatLng location) {
this.price = price;
this.address = address;
this.numberOfBed = numberOfBed;
this.numberOfBath = numberOfBath;
this.numberOfCar = numberOfCar;
this.propertyImage = propertyImage;
this.lotDim = lotDim;
this.propertyDesc = propertyDesc;
this.propertyDim = propertyDim;
this.lotTerrainType = lotTerrainType;
this.lotTerrainDimExt = lotTerrainDimExt;
this.lotTerrainSteepness = lotTerrainSteepness;
this.location = location;
}
protected Property(Parcel in) {
price = in.readInt();
address = in.readString();
numberOfBed=in.readInt();
numberOfBath = in.readInt();
numberOfCar = in.readInt();
propertyImage = in.readString();
lotDim = in.readFloat();
propertyDesc = in.readString();
propertyDim = in.readFloat();
lotTerrainType = in.readString();
lotTerrainDimExt = in.readString();
lotTerrainSteepness = in.readString();
location = in.readParcelable(getClass().getClassLoader());
}
public static final Creator<Property> CREATOR = new Creator<Property>() {
#Override
public Property createFromParcel(Parcel in) {
return new Property(in);
}
#Override
public Property[] newArray(int i) {
return new Property[i];
}
};
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getNumberOfBed() {
return numberOfBed;
}
public void setNumberOfBed(int numberOfBed) {
this.numberOfBed = numberOfBed;
}
public int getNumberOfBath() {
return numberOfBath;
}
public void setNumberOfBath(int numberOfBath) {
this.numberOfBath = numberOfBath;
}
public int getNumberOfCar() {
return numberOfCar;
}
public void setNumberOfCar(int numberOfCar) {
this.numberOfCar = numberOfCar;
}
public String getPropertyImage() {
return propertyImage;
}
public void setPropertyImage(String propertyImage) {
this.propertyImage = propertyImage;
}
public float getLotDim() {
return lotDim;
}
public void setLotDim(float lotDim) {
this.lotDim = lotDim;
}
public String getPropertyDesc() {
return propertyDesc;
}
public void setPropertyDesc(String propertyDesc) {
this.propertyDesc = propertyDesc;
}
public float getPropertyDim() {
return propertyDim;
}
public void setPropertyDim(float propertyDim) {
this.propertyDim = propertyDim;
}
public String getLotTerrainType() {
return lotTerrainType;
}
public void setLotTerrainType(String lotTerrainType) {
this.lotTerrainType = lotTerrainType;
}
public String getLotTerrainDimExt() {
return lotTerrainDimExt;
}
public void setLotTerrainDimExt(String lotTerrainDimExt) {
this.lotTerrainDimExt = lotTerrainDimExt;
}
public String getLotTerrainSteepness() {
return lotTerrainSteepness;
}
public void setLotTerrainSteepness(String lotTerrainSteepness) {
this.lotTerrainSteepness = lotTerrainSteepness;
}
public LatLng getLocation() {
return location;
}
public void setLocation(LatLng location) {
this.location = location;
}
#Override
public int describeContents(){
return 0;
}
#Override
public void writeToParcel( Parcel dest, int flags){
dest.writeInt(price);
dest.writeString(address);
dest.writeInt(numberOfBed);
dest.writeInt(numberOfBath);
dest.writeInt(numberOfCar);
dest.writeString(propertyImage);
dest.writeFloat(lotDim);
dest.writeString(propertyDesc);
dest.writeFloat(propertyDim);
dest.writeString(lotTerrainType);
dest.writeString(lotTerrainDimExt);
dest.writeString(lotTerrainSteepness);
dest.writeParcelable(location,flags);
}
}
The Fragment that use the model class, it takes data from firebase database, and also has anintent to a detailed view
package com.realty.drake.kunuk;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.widget.CircularProgressDrawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.text.NumberFormat;
import java.util.Locale;
/**
* Created by drake on 4/11/18
*/
public class Tab1Buy extends Fragment {
private DatabaseReference propertyRef;
private RecyclerView mPropertyRecyclerView;
FirebaseRecyclerAdapter<Property, PropertyViewHolder> mPropertyAdapter;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.property_tab, container, false);
mPropertyRecyclerView = rootView.findViewById(R.id.property_recyclerView);
return rootView;
}
//TODO Check internet and display error msg if internet down
#Override
public void onViewCreated(final View view, #Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mPropertyRecyclerView.hasFixedSize();
mPropertyRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
final ProgressBar progressBar = view.findViewById(R.id.progressBar);
progressBar.setVisibility(View.VISIBLE);
propertyRef = FirebaseDatabase.getInstance()
.getReference()
.child("Buy");
propertyRef.keepSynced(true);
// keyQuery - the Firebase location containing the list of keys to be found in dataRef
//Query personQuery = propertyRef.orderByKey();
FirebaseRecyclerOptions<Property> options =
new FirebaseRecyclerOptions.Builder<Property>()
.setQuery(propertyRef, Property.class)
.build();
mPropertyAdapter = new FirebaseRecyclerAdapter<Property, PropertyViewHolder>(options) {
#Override
// Bind the Property object to the ViewHolder PropertyHolder
public void onBindViewHolder(#NonNull PropertyViewHolder holder,
final int position, #NonNull final Property model) {
holder.setPrice(model.getPrice());
holder.setAddress(model.getAddress());
holder.setNumberOfBed(model.getNumberOfBed());
holder.setNumberOfBath(model.getNumberOfBath());
holder.setNumberOfCar(model.getNumberOfCar());
holder.setPropertyImage(model.getPropertyImage());
//This Intent send Parcelable from Property to PropertyDetail
holder.itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
getActivity().startActivity(new Intent(getActivity(), PropertyDetail.class)
.putExtra("Property", model));
}
});
}
#Override
public PropertyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new instance of the ViewHolder, in this case we are using a custom
// layout called R.layout.property_card for each item
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.property_card, parent, false);
return new PropertyViewHolder(view);
}
#Override
public void onDataChanged() {
// Called each time there is a new data snapshot. You may want to use this method
// to hide a loading spinner or check for the "no documents" state and update your UI.
// ...
progressBar.setVisibility(View.GONE);
}
//TODO Implement onError
#Override
public void onError(#NonNull DatabaseError e) {
// Called when there is an error getting data. You may want to update
// your UI to display an error message to the user.
// ...
progressBar.setVisibility(View.GONE);
Toast.makeText(getActivity(), "DatabaseError", Toast.LENGTH_SHORT).show();
}
};
mPropertyRecyclerView.setAdapter(mPropertyAdapter);
}
#Override
public void onStart() {
super.onStart();
mPropertyAdapter.startListening();
}
#Override
public void onStop() {
super.onStop();
mPropertyAdapter.stopListening();
}
public class PropertyViewHolder extends RecyclerView.ViewHolder {
View mView;
public PropertyViewHolder(View itemView) {
super(itemView);
mView = itemView;
}
public void setPrice(int price) {
String currencyPrice = NumberFormat //Format the price variable in currency form
.getCurrencyInstance(Locale.US)
.format(price);
TextView Price = mView.findViewById(R.id.post_price);
Price.setText(currencyPrice);
}
public void setAddress(String address){
TextView Address = mView.findViewById(R.id.post_address);
Address.setText(String.valueOf(address));
}
public void setNumberOfBed(int numberOfBed){
TextView NumberOfBed = mView.findViewById(R.id.post_bedroom);
NumberOfBed.setText(String.valueOf(numberOfBed));
}
public void setNumberOfBath(int numberOfBath){
TextView NumberOfBath = mView.findViewById(R.id.post_bathroom);
NumberOfBath.setText(String.valueOf(numberOfBath));
}
public void setNumberOfCar(int numberOfCar) {
TextView NumberOfCar = mView.findViewById(R.id.post_garage);
NumberOfCar.setText(String.valueOf(numberOfCar));
}
public void setPropertyImage(String propertyImage){
ImageView imageView = mView.findViewById(R.id.post_propertyImage);
//take one long string containing multiple url in and parse it
String propertyImageArray[] = propertyImage.split(",");
//Loading circle for placeholder, ColorAccent has been used
CircularProgressDrawable progressDrawable =
new CircularProgressDrawable(getContext());
progressDrawable.setStrokeWidth(5f);
progressDrawable.setCenterRadius(30f);
progressDrawable.setColorSchemeColors(Color.argb(1,255,145,0));
progressDrawable.start();
// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
GlideApp.with(getContext())
.load(propertyImageArray[0])
.placeholder(progressDrawable)
.fitCenter()
.into(imageView);
}
}
}
The detailed activity which is called by an intent from Tab1Buy
package com.realty.drake.kunuk;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.view.MenuItem;
import android.widget.Toast;
import java.text.NumberFormat;
import java.util.Locale;
public class PropertyDetail extends AppCompatActivity implements Toolbar.OnMenuItemClickListener {
#Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.property_detail);
Toolbar myToolbar = (Toolbar) findViewById(R.id.kunuk_toolbar);
myToolbar.inflateMenu(R.menu.menu_detail);
setSupportActionBar(myToolbar);
myToolbar.setOnMenuItemClickListener(this);
//collect our intent
Intent intent = getIntent();
Property property = intent.getParcelableExtra("Property");
boolean isRent = getIntent().getBooleanExtra("isRent", false);
//collect all property values from Parcelable
int price = property.getPrice();
String address = property.getAddress();
int numberOfBed = property.getNumberOfBed();
int numberOfBath = property.getNumberOfBath();
int numberOfCar = property.getNumberOfCar();
String propertyImage = property.getPropertyImage();
float propertyDim = property.getPropertyDim();
String propertyDesc = property.getPropertyDesc();
// Get a support ActionBar corresponding to this toolbar
ActionBar ab = getSupportActionBar();
// Enable the Up button
ab.setDisplayHomeAsUpEnabled(true);
BottomNavigationView bottomNavigationView = (BottomNavigationView)
findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
#Override
public boolean onNavigationItemSelected(#NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_call:
Uri callNumberUri = Uri.parse("tel:+50937438713");
Intent callIntent = new Intent(Intent.ACTION_DIAL, callNumberUri);
startActivity(callIntent);
break;
case R.id.action_sms:
Uri smsNumberUri = Uri.parse("sms:+50937438713");
Intent smsIntent = new Intent(Intent.ACTION_SENDTO, smsNumberUri);
startActivity(smsIntent);
break;
case R.id.action_email:
//TODO get a property id to use in subject email field
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("message/rfc822");
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Kunuk Request");
emailIntent.putExtra(Intent.EXTRA_EMAIL,
new String[] {"drakecolinj#gmail.com"});
startActivity(emailIntent);
}
return false;
}
});
//Bind the data from the Parcelable to the Views
TextView addressDetail = findViewById(R.id.post_address);
addressDetail.setText(String.valueOf(address));
String currencyPrice = NumberFormat //Format the price variable in currency form
.getCurrencyInstance(Locale.US)
.format(price);
TextView priceDetail = findViewById(R.id.post_price);
priceDetail.setText(currencyPrice);
ImageView imageView = findViewById(R.id.post_propertyImage);
//take one long string containing multiple url and parse it
String propertyImageArray[] = propertyImage.split(",");
//TODO add loading icon for placeholder
// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
GlideApp.with(getApplication())
.load(propertyImageArray[0])
.fitCenter()
.into(imageView);
TextView bathroomDetail = findViewById(R.id.post_bathroom);
bathroomDetail.setText(String.valueOf(numberOfBath));
TextView bedroomDetail = findViewById(R.id.post_bedroom);
bedroomDetail.setText(String.valueOf(numberOfBed));
TextView garageDetail = findViewById(R.id.post_garage);
garageDetail.setText(String.valueOf(numberOfCar));
TextView propertyDimDetail = findViewById(R.id.property_dim);
propertyDimDetail.setText(String.valueOf(propertyDim));
TextView propertyDescDetail = findViewById(R.id.property_desc);
propertyDescDetail.setText(String.valueOf(propertyDesc));
if (isRent) {
final TextView rentUnit = findViewById(R.id.rent_unit_detail);
rentUnit.setVisibility(View.VISIBLE);
}
}
#Override
public boolean onMenuItemClick(MenuItem item){
switch (item.getItemId()) {
case R.id.action_share:
Toast.makeText(this, "Shared", Toast.LENGTH_SHORT).show();
return true;
}
return true;
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_detail, menu);
return true;
}
}
In Child "Buy", each of its child has its own location key and the same for Rent and Lot.
Please help, conceptual explanation and code please
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Buy");
databaseReference.addChildEventListener(new ChildEventListener() {
#Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
// Let us retrieve value of location
Log.i("Price", dataSnapshot.child("location").getValue().toString());
// In this way you can retrieve all the fileds.
}
#Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
#Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
#Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
#Override
public void onCancelled(DatabaseError databaseError) {
}
});
Similarly for Rent & Lot you can pass as -
DatabaseReference dbRent = FirebaseDatabase.getInstance().getReference("Rent");
DatabaseReference dbLot = FirebaseDatabase.getInstance().getReference("Lot");
I hope this will helps!
I did recyclerView, and each child is "Detail".
I am now asking how to sent user to the next activity when he click on "Detail". For each click send him to the other activity.
private List<ParentObject> initData() {
TitleCreator titleCreator = TitleCreator.get(this);
List<TitleParent> titles = titleCreator.getAll();
List<ParentObject> parentObject = new ArrayList<>();
for(TitleParent title:titles)
{
List<Object> childList = new ArrayList<>();
childList.add(new TitleChild("Detail", ""));
title.setChildObjectList(childList);
parentObject.add(title);
}
return parentObject;
}
This is code where I put every child to be "Detail".
I had four Parent titles and of course four child titles. When user click on first *Parent title it open child title. Question is when user click on this child title how to send him to the other activity?
Here is my adapter fil
package com.example.user_pc.glavnastranicaprojekat.Adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import
com.bignerdranch.expandablerecyclerview.Adapter.ExpandableRecyclerAdapter;
import com.bignerdranch.expandablerecyclerview.Model.ParentObject;
import com.example.user_pc.glavnastranicaprojekat.models.TitleChild;
import com.example.user_pc.glavnastranicaprojekat.models.TitleParent;
import com.example.user_pc.glavnastranicaprojekat.R;
import
com.example.user_pc.glavnastranicaprojekat.ViewHolders.TitleChildViewHolder;
import
com.example.user_pc.glavnastranicaprojekat.ViewHolders.TitleParentViewHolder;
import java.util.List;
public class MyAdapter extends
ExpandableRecyclerAdapter<TitleParentViewHolder,TitleChildViewHolder> {
LayoutInflater inflater;
public MyAdapter(Context context, List<ParentObject> parentItemList) {
super(context, parentItemList);
inflater = LayoutInflater.from(context);
}
#Override
public TitleParentViewHolder onCreateParentViewHolder(ViewGroup viewGroup) {
View view = inflater.inflate(R.layout.list_parent,viewGroup,false);
return new TitleParentViewHolder(view);
}
#Override
public TitleChildViewHolder onCreateChildViewHolder(ViewGroup viewGroup) {
View view = inflater.inflate(R.layout.list_child,viewGroup,false);
return new TitleChildViewHolder(view);
}
#Override
public void onBindParentViewHolder(TitleParentViewHolder titleParentViewHolder, int i, Object o) {
TitleParent title = (TitleParent)o;
titleParentViewHolder._textView.setText(title.getTitle());
}
#Override
public void onBindChildViewHolder(TitleChildViewHolder titleChildViewHolder, int i, Object o) {
TitleChild title = (TitleChild)o;
titleChildViewHolder.option1.setText(title.getOption1());
titleChildViewHolder.option2.setText(title.getOption2());
}
}
TitleParent.java :
package com.example.user_pc.glavnastranicaprojekat.models;
import com.bignerdranch.expandablerecyclerview.Model.ParentObject;
import java.util.List;
import java.util.UUID;
public class TitleParent implements ParentObject{
private List<Object> mChildrenList;
private UUID _id;
private String title;
public TitleParent(String title) {
this.title = title;
_id = UUID.randomUUID();
}
public UUID get_id() {
return _id;
}
public void set_id(UUID _id) {
this._id = _id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
#Override
public List<Object> getChildObjectList() {
return mChildrenList;
}
#Override
public void setChildObjectList(List<Object> list) {
mChildrenList = list;
}
}
Here is TitleChild.java:
package com.example.user_pc.glavnastranicaprojekat.models;
public class TitleChild {
public String option1;
public String option2;
public TitleChild(String option1, String option2) {
this.option1 = option1;
this.option2 = option2;
}
public String getOption1() {
return option1;
}
public void setOption1(String option1) {
this.option1 = option1;
}
public String getOption2() {
return option2;
}
public void setOption2(String option2) {
this.option2 = option2;
}
}
TitleCreator.java:
package com.example.user_pc.glavnastranicaprojekat.models;
import android.content.Context;
import java.util.ArrayList;
import java.util.List;
public class TitleCreator {
static TitleCreator _titleCreator;
List<TitleParent> _titleParents;
public TitleCreator(Context context) {
_titleParents = new ArrayList<>();
TitleParent title = new TitleParent(String.format("Coppa"));
_titleParents.add(title);
TitleParent title1 = new TitleParent(String.format("Levante"));
_titleParents.add(title1);
TitleParent title2 = new TitleParent(String.format("Monument"));
_titleParents.add(title2);
TitleParent title3 = new TitleParent(String.format("Comming soon"));
_titleParents.add(title3);
}
public static TitleCreator get(Context context)
{
if(_titleCreator == null)
_titleCreator = new TitleCreator(context);
return _titleCreator;
}
public List<TitleParent> getAll() {
return _titleParents;
}
}
TitleChildViewHolder:
package com.example.user_pc.glavnastranicaprojekat.ViewHolders;
import android.view.View;
import android.widget.TextView;
import com.bignerdranch.expandablerecyclerview.ViewHolder.ChildViewHolder;
import com.example.user_pc.glavnastranicaprojekat.R;
public class TitleChildViewHolder extends ChildViewHolder {
public TextView option1,option2;
public TitleChildViewHolder(View itemView) {
super(itemView);
option1 = itemView.findViewById(R.id.option1);
option2 = itemView.findViewById(R.id.option2);
}
}
TitleParentViewHolder:
package com.example.user_pc.glavnastranicaprojekat.ViewHolders;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import com.bignerdranch.expandablerecyclerview.ViewHolder.ParentViewHolder;
import com.example.user_pc.glavnastranicaprojekat.R;
public class TitleParentViewHolder extends ParentViewHolder {
public TextView _textView;
public ImageButton _imageButton;
public TitleParentViewHolder(View itemView) {
super(itemView);
_textView = itemView.findViewById(R.id.parentTitle);
_imageButton = itemView.findViewById(R.id.expandArrow);
}
}
MainActivity:
RecyclerView recyclerView;
#Override
protected void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
recyclerView = findViewById(R.id.myRecyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
MyAdapter adapter = new MyAdapter(this,initData());
adapter.setParentClickableViewAnimationDefaultDuration();
adapter.setParentAndIconExpandOnClick(true);
recyclerView.setAdapter(adapter);
}
private List<ParentObject> initData() {
TitleCreator titleCreator = TitleCreator.get(this);
List<TitleParent> titles = titleCreator.getAll();
List<ParentObject> parentObject = new ArrayList<>();
for(TitleParent title:titles)
{
List<Object> childList = new ArrayList<>();
childList.add(new TitleChild("Detail", ""));
title.setChildObjectList(childList);
parentObject.add(title);
}
return parentObject;
}
titleChildViewHolder.itemView.setOnClickListener(
new OnClickListener(View v){
context.startActivity(new Intent(context,DESTINATION_ACTIVITY.class)));
}
);
Put this code inside onBindChildViewHolder
try something like this:
#Override
public void onBindChildViewHolder(TitleChildViewHolder titleChildViewHolder, int i, Object o) {
TitleChild title = (TitleChild)o;
titleChildViewHolder.option1.setText(title.getOption1());
titleChildViewHolder.option2.setText(title.getOption2());
titleChildViewHolder.option1.setOnClickListener(
new OnClickListener(View v){
context.startActivity(new Intent(context,ACTIVITY_TO_LAUNCH.class)));
}
);
}
If you need you can set an equivalent OnClickListener also on titleChildViewHolder.option2
Maybe you could add a container of views option1 and option2 so you could set only one ClickListener