Я извлекаю некоторые данные из JSON в свой ListView с помощью моего специального адаптера:
adapter = new ActorAdapter(this, R.layout.data_item, actorsList);
JSON содержит 5 элементов. Все в порядке, все элементы отображаются, но ... поскольку я использую также службы определения местоположения, мне нужно обновить ListView (расстояние и т. Д.).
Это происходит здесь:
private void updateUI(Location loc) {
double Act1=loc.getLatitude();
double Act2=loc.getLongitude();
ListView lv = findViewById(R.id.listView1);
lv.setAdapter(adapter);
adapter.clear();adapter.notifyDataSetChanged();
new GetContacts().execute();}
Проблема заключалась в том, что после каждого обновления мой ListView имел одни и те же данные больше раз - дубликаты. Итак, как вы можете видеть выше, я попытался использовать adapter.clear();adapter.notifyDataSetChanged();
Однако это работает почти нормально, дубликатов больше нет - но после каждого обновления ListView всегда показывает только 4 элемента вместо 5.
Так, в первый раз ListView загружает 5 элементов - хорошо, но после следующего и каждого обновления он показывает только 4 элемента. Это странно и не может найти проблему, почему это ...
Присоединение моей асинхронной задачи GetContacts:
class GetContacts extends AsyncTask<String, Void, Boolean> {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(Okoli.this);
dialog.setMessage("Loading data");
dialog.setTitle("Connecting");
dialog.show();
dialog.setCancelable(false);
}
@Override
protected Boolean doInBackground(String... args) {
HttpHandler sh = new HttpHandler();
String url = "androidnews.json";
String jsonStr = sh.makeServiceCall(url);Double myDistx;
if (jsonStr != null) {
try {JSONObject jsonObj = new JSONObject(jsonStr);
JSONArray actors = jsonObj.getJSONArray("result");
for (int i = 0; i < actors.length(); i++) {
JSONObject c = actors.getJSONObject(i);
Actors actor = new Actors();
double g1 = Double.parseDouble(c.getString("gps1"));
double g2 = Double.parseDouble(c.getString("gps2"));
double Act1=loc.getLatitude();
double Act2=loc.getLongitude();
myDistx = meterDistanceBetweenPoints(g1,g2,Act1,Act2);
actor.setNazov(c.getString("name"));
actor.setPerex(c.getString("perex"));
actor.setPlace(c.getString("place"));
actor.setGps1(c.getString("gps1"));
actor.setGps2(c.getString("gps2"));
actor.setDist(myDistx);
actorsList.add(actor);
}
} catch (final JSONException e) {
Okoli.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(Okoli.this.getApplicationContext(),
"Data error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}); }
return true;
} else {
Okoli.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(Okoli.this.getApplicationContext(),
"Network error",
Toast.LENGTH_LONG).show();
}
});
return false;
}
}
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
dialog.dismiss();
adapter.notifyDataSetChanged();
}
}
, а также мой адаптер:
public class ActorAdapter extends ArrayAdapter<Actors> {
private Context context;
private ArrayList<Actors> actorList;
private LayoutInflater vi;
private int Resource;
ActorAdapter(Context context, int resource, ArrayList<Actors> objects) {
super(context, resource, objects);
this.context = context;
vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Resource = resource;
actorList = objects; }
@NonNull
@Override
public View getView(final int position, View convertView, @NonNull final ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if (v == null) {
holder = new ViewHolder();
v = vi.inflate(Resource, null);
holder.tvNazov = v.findViewById(R.id.tvNazov);
holder.tvPlace = v.findViewById(R.id.tvPlace);
holder.tvPerex = v.findViewById(R.id.tvPerex);
holder.tvDist = v.findViewById(R.id.tvDist);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
holder.tvNazov.setText(actorList.get(position).getNazov());
holder.tvPlace.setText(actorList.get(position).getPlace());
holder.tvPerex.setText(actorList.get(position).getPerex());
String newDist = String.format("%.1f", actorList.get(position).getDist());
holder.tvDist.setText(newDist);
return v;
}
static class ViewHolder {
TextView tvNazov;
TextView tvPerex;
TextView tvPlace;
TextView tvDist;
}
}