JSON данные показывают null после публикации моего приложения в Google Play, но они показывают данные в эмуляторе при запуске неопубликованного исходного кода приложения. Данные поступают из базы данных онлайн с внешнего сервера. Данные json видны в URL-адресе, но в моем опубликованном приложении отображается значение null. В чем может быть причина ?? .....
ПОМОГИТЕ МНЕ
Это моя MainActivity
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.json.JSONArray;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class JUR extends AppCompatActivity implements jurAdapter.JURAdapterListener {
private static final String TAG = MainActivity.class.getSimpleName();
private RecyclerView recyclerView2;
private List<JURlist> jurList;
private jurAdapter mAdapter;
private SearchView searchView;
ProgressBar progressBar2;
static {
System.loadLibrary("keys");
}
public native String getJUR();
public native String geturl2();
String getJUR = URLEncoder.encode(getJUR());
String geturl2 = URLEncoder.encode(geturl2());
// url to fetch contacts json
private final String URL = "https://"+geturl2+"/...../"+getJUR;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jur);
progressBar2 = findViewById(R.id.progress2);
progressBar2.setVisibility(View.VISIBLE);
Toolbar toolbar2 = findViewById(R.id.toolbar2);
setSupportActionBar(toolbar2);
// toolbar fancy stuff
// getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(R.string.toolbar_JUR);
recyclerView2 = findViewById(R.id.recycler_view2);
jurList = new ArrayList<>();
mAdapter = new jurAdapter(this, jurList, this);
// white background notification bar
whiteNotificationBar(recyclerView2);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView2.setLayoutManager(mLayoutManager);
recyclerView2.setItemAnimator(new DefaultItemAnimator());
recyclerView2.addItemDecoration(new MyDividerItemDecoration(this, DividerItemDecoration.VERTICAL, 36));
recyclerView2.setAdapter(mAdapter);
fetchJUR();
}
/**
* fetches json by making http calls
*/
private void fetchJUR() {
JsonArrayRequest request = new JsonArrayRequest(URL,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
if (response == null) {
Toast.makeText(getApplicationContext(), "Couldn't fetch JURISDICTION Pleas try again.", Toast.LENGTH_LONG).show();
return;
}
List<JURlist> items = new Gson().fromJson(response.toString(), new TypeToken<List<JURlist>>() {
}.getType());
// adding contacts to contacts list
jurList.clear();
jurList.addAll(items);
// refreshing recycler view
mAdapter.notifyDataSetChanged();
progressBar2.setVisibility(View.GONE);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// error in getting json
Log.e(TAG, "Error: " + error.getMessage());
Toast.makeText(getApplicationContext(), "Error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
APP.getInstance().addToRequestQueue(request);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.action_search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
// listening to search query text change
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// filter recycler view when query submitted
mAdapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String query) {
// filter recycler view when text is changed
mAdapter.getFilter().filter(query);
return false;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_search) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
// close search view on back button pressed
if (!searchView.isIconified()) {
searchView.setIconified(true);
return;
}
super.onBackPressed();
}
private void whiteNotificationBar(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int flags = view.getSystemUiVisibility();
flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
view.setSystemUiVisibility(flags);
getWindow().setStatusBarColor(Color.WHITE);
}
}
@Override
public void onJURSelected(JURlist jur) {
Toast.makeText(getApplicationContext(), "Selected: " + jur.getSTATE() + ", " + jur.getZONE(), Toast.LENGTH_LONG).show();
}
}
Это адаптер
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class jurAdapter extends RecyclerView.Adapter<jurAdapter.MyViewHolder>
implements Filterable {
private Context context;
private List<JURlist> JuRlist;
private List<JURlist> JURlistFiltered;
private JURAdapterListener listener;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView STATE, ZONE, COM, DIVI, RANAME, RANGE1;
// public ImageView thumbnail;
public MyViewHolder(View view) {
super(view);
STATE = view.findViewById(R.id.STATE);
ZONE = view.findViewById(R.id.ZONE);
COM = view.findViewById(R.id.COM);
DIVI = view.findViewById(R.id.DIVI);
RANAME = view.findViewById(R.id.RANAME);
RANGE1 = view.findViewById(R.id.RANGE1);
// thumbnail = view.findViewById(R.id.thumbnail);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// send selected contact in callback
listener.onJURSelected(JURlistFiltered.get(getAdapterPosition()));
}
});
}
}
public jurAdapter(Context context, List<JURlist> JURLIST, JURAdapterListener listener) {
this.context = context;
this.listener = listener;
this.JuRlist = JURLIST;
this.JURlistFiltered = JURLIST;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent1, int viewType1) {
View itemView = LayoutInflater.from(parent1.getContext())
.inflate(R.layout.jur_item_row, parent1, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
final JURlist jurlist = JURlistFiltered.get(position);
holder.STATE.setText("STATE : "+jurlist.getSTATE()+"\r\n") ;
holder.ZONE.setText("ZONE : "+jurlist.getZONE()+"\r\n");
holder.COM.setText("COMMISSIONERATE NAME : "+jurlist.getCOM()+"\r\n");
holder.DIVI.setText("DIVISION NAME : "+jurlist.getDIVI()+"\r\n");
holder.RANAME.setText("RANGE NAME : "+jurlist.getRANAME()+"\r\n");
holder.RANGE1.setText("RANGE JURISDICTION : \r\n"+jurlist.getRANGE1());
// Glide.with(context)
// .load(contact.getImage())
// .apply(RequestOptions.circleCropTransform())
// .into(holder.thumbnail);
}
@Override
public int getItemCount() {
return JURlistFiltered.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
JURlistFiltered = JuRlist;
} else {
List<JURlist> filteredList = new ArrayList<>();
for (JURlist row : JuRlist) {
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
if (row.getSTATE().toLowerCase().contains(charString.toLowerCase()) || row.getZONE().toLowerCase().contains(charString.toLowerCase()) || row.getCOM().toLowerCase().contains(charString.toLowerCase()) || row.getDIVI().toLowerCase().contains(charString.toLowerCase()) || row.getRANAME().toLowerCase().contains(charString.toLowerCase()) || row.getRANGE1().toLowerCase().contains(charString.toLowerCase())) {
filteredList.add(row);
}
}
JURlistFiltered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = JURlistFiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
JURlistFiltered = (ArrayList<JURlist>) filterResults.values;
notifyDataSetChanged();
}
};
}
public interface JURAdapterListener {
void onJURSelected(JURlist jur);
}
}```
[1]: https://i.stack.imgur.com/vcWmG.jpg