My application works normally on the emulator, but When I install it on a physical phone, I cannot access the images I defined as URL in Firebase. So when I upload the application to the phone, there are no pictures. Apart from that everything works fine in practice. Is there anything you can recommend me to do? Android version of phone: Android 7 API 24.
this is emulator
this is my phone
package com.orderfood.teknomerkez.orderfood;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
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;
import com.mancj.materialsearchbar.MaterialSearchBar;
import com.orderfood.teknomerkez.orderfood.Interface.ItemClickListener;
import com.orderfood.teknomerkez.orderfood.Model.Food;
import com.orderfood.teknomerkez.orderfood.ViewHolder.FoodViewHolder;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
public class FoodList extends AppCompatActivity {
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
FirebaseDatabase database;
DatabaseReference foodList;
private final String REFERENCE = "Food";
private String FoodId = "FoodId";
String categoryID = "";
FirebaseRecyclerAdapter<Food, FoodViewHolder> adapter;
FirebaseRecyclerAdapter<Food, FoodViewHolder> searchAdapter;
List<String> suggestList = new ArrayList<>();
MaterialSearchBar materialSearchBar;
private String getCategoryId = "CategoryId";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_food_list);
//Firebase
database = FirebaseDatabase.getInstance();
foodList = database.getReference(REFERENCE);
recyclerView = findViewById(R.id.recycler_food);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//get intent
if (getIntent() != null)
categoryID = getIntent().getStringExtra(getCategoryId);
if (!categoryID.isEmpty() && categoryID != null) {
loadListFood(categoryID);
}
//material Search
materialSearch();
}
private void materialSearch() {
materialSearchBar = findViewById(R.id.searchBar);
materialSearchBar.setHint("Enter Your Food");
loadSuggest();
materialSearchBar.setLastSuggestions(suggestList);
materialSearchBar.setCardViewElevation(10);
materialSearchBar.addTextChangeListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//when user type something, we will change suggestlist
List<String> suggest = new ArrayList<>();
for (String search : suggest) { // loop in suggest list
if (search.toLowerCase().contains(materialSearchBar.getText().toLowerCase())) {
suggest.add(search);
}
materialSearchBar.setLastSuggestions(suggest);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
materialSearchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener() {
@Override
public void onSearchStateChanged(boolean enabled) {
//when search bar is close - restore original adapter
if (!enabled)
recyclerView.setAdapter(adapter);
}
@Override
public void onSearchConfirmed(CharSequence text) {
//when searhc finish
startSearch(text);
}
@Override
public void onButtonClicked(int buttonCode) {
}
});
}
private void loadSuggest() {
foodList.orderByChild("MenuId").equalTo(categoryID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot postSnapShot : dataSnapshot.getChildren()){
Food item = postSnapShot.getValue(Food.class);
suggestList.add(item.getName());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void startSearch(CharSequence text) {
Query query = FirebaseDatabase.getInstance()
.getReference()
.child("Food")
.startAt(text.toString())
.limitToLast(50);
FirebaseRecyclerOptions<Food> options = new FirebaseRecyclerOptions.Builder<Food>().setQuery(query, Food.class).build();
searchAdapter = new FirebaseRecyclerAdapter<Food, FoodViewHolder>(options)
{
@NonNull
@Override
public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.food_item, parent,false);
return new FoodViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull FoodViewHolder viewHolder, int position, @NonNull Food model) {
viewHolder.food_name.setText(model.getName());
Picasso.with(getBaseContext()).load(model.getImage())
.into(viewHolder.food_image);
final Food local = model;
viewHolder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
Toast.makeText(FoodList.this, "" + local.getName(), Toast.LENGTH_SHORT).show();
//go food
Intent foodDetail = new Intent(FoodList.this, FoodDetail.class);
foodDetail.putExtra(FoodId, searchAdapter.getRef(position).getKey());
startActivity(foodDetail);
}
});
}
};
recyclerView.setAdapter(searchAdapter); //set adapter for recycler view is search result
}
private void loadListFood(String categoryID) {
Query query = FirebaseDatabase.getInstance()
.getReference()
.child("Food")
.child(categoryID);
FirebaseRecyclerOptions<Food> options = new FirebaseRecyclerOptions.Builder<Food>().setQuery(query,Food.class).build();
adapter = new FirebaseRecyclerAdapter<Food, FoodViewHolder>(options) {
@NonNull
@Override
public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.food_item, parent,false);
return new FoodViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull FoodViewHolder viewHolder, int position, @NonNull Food model) {
viewHolder.food_name.setText(model.getName());
Log.d("TAG", model.getName());
Picasso.with(getBaseContext()).load(model.getImage())
.into(viewHolder.food_image);
final Food local = model;
viewHolder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
Toast.makeText(FoodList.this, "" + local.getName(), Toast.LENGTH_SHORT).show();
//go food
Intent foodDetail = new Intent(FoodList.this, FoodDetail.class);
//foodDetail.putExtra("FoodId", adapter.getItem(position).getFoodId());
foodDetail.putExtra("FoodId", String.valueOf(position));
foodDetail.putExtra("CategoryID", adapter.getItem(position).getMenuId());
foodDetail.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(foodDetail);
}
});
}
};
Log.d("TAG", "" + adapter.getItemCount());
recyclerView.setAdapter(adapter);
}
@Override
protected void onStart(){
super.onStart();
adapter.startListening();
}
@Override
protected void onStop(){
super.onStop();
adapter.stopListening();
}
}
I have solved this problem. Because I am not going to change images that I want to see, I have customize model classes variables. I have changed like this;
from
private String Image;
to
public String Image;
I was using getter and setter methods to see Images. After that I have changed FoodList adapter methods like this;
Picasso p = Picasso.get();
p.load(model.Image).into(viewHolder.food_image);
As you can see I have also updated Picasso. I have used the latest version. It is used get()
instead of with()
. It doesnt need getBaseContext()
.
As I told you that I am not going to change images. So I can use model.Image
If your images are changeable, you need to use getter and setter methods as you know.