【问题标题】:ListView showing less items after updating adapter - androidListView 在更新适配器后显示较少的项目 - android
【发布时间】:2018-04-30 22:59:01
【问题描述】:

我正在使用我的自定义适配器将一些数据从 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;
    }
}

【问题讨论】:

  • 我们还需要查看 getcontacts 异步任务和您的 actoradapter
  • 添加到我的问题
  • 我看不到您如何更新适配器内的数据。通常你会为你的适配器添加一个 setData/addData 方法。然后从那里去。

标签: android json listview android-arrayadapter notifydatasetchanged


【解决方案1】:

您的适配器将actorsList 引用为数据源,但此变量永远不会被清空。

【讨论】:

  • 嗯,但是如何清空actorList呢?我尝试使用actorsList.clear();,但没有帮助。我尝试在 JSON 之后立即记录 GetContacts 中的项目数,第一次是 5,下一次是 4 - Log.e("count",String.format("value = %d", actors.length()));
  • 好的,所以我调查了一下,可能是我的 JSON 的一些东西。它有这样的结构:{"result": [{"letter": "","name": "Myname",... 当我从 url 记录 jsonStr 响应时,第一次有那个空字母,但下一次它被忽略了,JSON 中的第一项是名称。出于某种原因,它在 JSON 中为空时会忽略该字母。当我在我的 JSON 中为每个项目填写 Letter 时,计数工作正常。
  • 我假设你找到了原因。您可以像使用 actorsList.clear() 一样清空您的 actorsList,但您必须在将适配器填入 AsyncTask (onPostExecute()) 后再次调用适配器上的 notifyDatasetChanged()
  • hm,似乎我错了 - 当我用一些数据填充 Letter 时,它适用于其他列表,但不是在这里我需要多次更新 ListView。在 onPostExecute() 中,我已经有了 notifyDatasetChanged()。问题是,在每次更新时,它都会忽略 JSON - Letter 中的第一项,不管它是否为空。第一次没问题 - 它也显示字母,但在每次更新时,日志仅显示 {"result": [{"name": "myName"... 并且字母丢失。我的应用显示错误 - 字母没有值。
  • 好吧,现在我在我的设备上重新安装了我的应用程序,重新运行调试,留下adapter.clear();adapter.notifyDataSetChanged(); 现在它似乎工作正常,字母总是在那里.. 也许 json 被缓存或不确定是什么问题,但现在每次更新后,这封信也会显示出来。也许我应该以某种方式避免 json 缓存
猜你喜欢
  • 2013-12-27
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多