Hej.
Od początku 🙂
Mam dane w bazie MySQL, tabela zwierakolumny id,imageUrl, kategoria, data.
Id wiadomo, kolejny numer, imageUrl - adres zdjęcia, kategoria - kategoria zdjęcia (psy, koty, ryby, konie), data - data dodania rekordu.
Napisałem skrypt PHP który generuje plik JSON z tymi danymi.
Po wpisaniu do przeglądarki adresu http://adres_serwera.pl/json.php wyświetla się coś takiego
Drugi skrypt w PHP pozwala na filtrowanie wyników
Po wpisaniu do przeglądarki adresu:http://adres_serwera.pl/json.php?kategoria=%27psy%27 wyświetla tylko te rekordy które w polu kategoria mają wartość "psy".
Oczywiście wszystko działa elegancko 🙂
Teraz przechodzimy do aplikacji. Apka pobiera dane JSON i wyświetla je w RecyclerView za pomoca CardView (dane są wyświetlane we fragmencie)
Kod wyświetlający dane z JSON:
public class WszystkoFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
private Activity referenceActivity;
private View parentHolder;
private final String JSON_URL = "http://adres_serwera.pl/json.php";
private JsonArrayRequest request;
private RequestQueue requestQueue;
private List<TabelaNews> mTabela;
private RecyclerView recyclerView;
private SwipeRefreshLayout mSwipeRefreshLayout;
public WszystkoFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
referenceActivity = getActivity();
parentHolder = inflater.inflate(R.layout.fragment_wszystko, container, false);
mTabela = new ArrayList<>();
recyclerView = (RecyclerView) parentHolder.findViewById(R.id.wszystko_recyclerView);
recyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
mSwipeRefreshLayout = (SwipeRefreshLayout) parentHolder.findViewById(R.id.wszystko_swipe);
mSwipeRefreshLayout.setOnRefreshListener(this);
mSwipeRefreshLayout.setColorSchemeResources(R.color.colorAccent);
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
jsonrequest();
}
});
return parentHolder;
}
@Override
public void onRefresh() {
jsonrequest();
}
private void jsonrequest() {
mSwipeRefreshLayout.setRefreshing(true);
mTabela = new ArrayList<>();
request = new JsonArrayRequest(JSON_URL, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
JSONObject jsonObject = null;
for (int i = 0; i <response.length(); i++) {
try {
jsonObject = response.getJSONObject(i);
TabelaNews tabelaNews = new TabelaNews();
tabelaNews.setId(jsonObject.getString("id"));
tabelaNews.setImageUrl(jsonObject.getString("imageurl"));
tabelaNews.setKategoria(jsonObject.getString("kategoria"));
tabelaNews.setData(jsonObject.getString("data"));
mTabela.add(tabelaNews);
} catch (JSONException e) {
e.printStackTrace();
}
mSwipeRefreshLayout.setRefreshing(false);
}
NewsAdapter myadapter = new NewsAdapter(getContext(), mTabela);
recyclerView.setAdapter(myadapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mSwipeRefreshLayout.setRefreshing(false);
}
});
requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
requestQueue.add(request);
}
}
I to działa pieknie na każdym Androidzie.
Jeśli chcę wyświetlić tylko np psy to zmieniam
private final String JSON_URL = "http://adres_serwera.pl/json.php";
na
private final String JSON_URL = "http://adres_serwera.pl/json.php?kategoria=%27psy%27";
Oczywiście wszystko działa poprawnie, aplikacja wyświetla zdjęcia w CardView.
Teraz zaczyna się problem. Chcę aby można było wybierać w aplikacji zdjęcia jakich zwierząt chcę oglądać.
Tworzę BottomBar z pięcioma przyciskami "WSZYSTKO", "PSY", "KOTY", "KONIE", "RYBY"
public class WszystkoFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
private Activity referenceActivity;
private View parentHolder;
private String JSON_URL = "http://adres_serwera.pl/json.php?kategoria=%27%%27";
private JsonArrayRequest request;
private RequestQueue requestQueue;
private List<TabelaNews> mTabela;
private RecyclerView recyclerView;
private BottomNavigationView mNav;
private SwipeRefreshLayout mSwipeRefreshLayout;
public WszystkoFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
referenceActivity = getActivity();
parentHolder = inflater.inflate(R.layout.fragment_wszystko, container, false);
mTabela = new ArrayList<>();
recyclerView = (RecyclerView) parentHolder.findViewById(R.id.wszystko_recyclerview);
recyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
mNav = (BottomNavigationView) parentHolder.findViewById(R.id.NavBot);
mNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.nav_wszystko){
JSON_URL = "http://adres_serwera.pl/json.php?kategoria=%27%%27";
jsonrequest();
}
if (item.getItemId() == R.id.nav_psy){
JSON_URL = "http://adres_serwera.pl/json.php?kategoria=%27psy%27";
jsonrequest();
}
if (item.getItemId() == R.id.nav_koty){
JSON_URL = "http://adres_serwera.pl/json.php?kategoria=%27koty%27";
jsonrequest();
}
if (item.getItemId() == R.id.nav_konie){
JSON_URL = "http://adres_serwera.pl/json.php?kategoria=%27konie%27";
jsonrequest();
}
if (item.getItemId() == R.id.nav_ryby){
JSON_URL = "http://adres_serwera.pl/json.php?kategoria=%27ryby%27";
jsonrequest();
}
return true;
}
});
mSwipeRefreshLayout = (SwipeRefreshLayout) parentHolder.findViewById(R.id.wszystko_swipe);
mSwipeRefreshLayout.setOnRefreshListener(this);
mSwipeRefreshLayout.setColorSchemeResources(R.color.colorAccent);
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
jsonrequest();
}
});
return parentHolder;
}
@Override
public void onRefresh() {
jsonrequest();
}
private void jsonrequest() {
mSwipeRefreshLayout.setRefreshing(true);
mTabela = new ArrayList<>();
request = new JsonArrayRequest(JSON_URL, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
JSONObject jsonObject = null;
for (int i = 0; i <response.length(); i++) {
try {
jsonObject = response.getJSONObject(i);
TabelaNews tabelaNews = new TabelaNews();
tabelaNews.setId(jsonObject.getString("id"));
tabelaNews.setImageUrl(jsonObject.getString("imageurl"));
tabelaNews.setKategoria(jsonObject.getString("kategoria"));
tabelaNews.setData(jsonObject.getString("data"));
mTabela.add(tabelaNews);
} catch (JSONException e) {
e.printStackTrace();
}
mSwipeRefreshLayout.setRefreshing(false);
}
NewsAdapter myadapter = new NewsAdapter(getContext(), mTabela);
recyclerView.setAdapter(myadapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mSwipeRefreshLayout.setRefreshing(false);
}
});
requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
requestQueue.add(request);
}
}
Kod na Androidzie 7 działa, tzn po wciśnięciu przycisku "PSY" wyświetla zdjęcia psów, "KOTY" - wyświetla koty itd...
Natomiast na Androidach niższych niż 7 kod nie działa. To znaczy nic się nie wyświetla.
Testowałem na rożnych telefonach Samsungi (S7, S4, S5, A5 2015, A5 2016, A3 2016, J5 2016) Huawei a nawet na jakiś dziwnych chińczykach. Zasada jest jedna Android 7 wszystko działa, Android 5 lub 6 - nie działa 🙁
Będę wdzięczny za każdą pomoc 🙂