ListView:列表项在滚动时重复

ListView : List Item are repeating on scroll

我有一个 ListView,其中显示了一些数据。我正在向服务器请求 JSON 形式的数据。此外,数据已分页。

第一次调用 API 时,它正在加载 n 个项目。

我已经实现了在到达列表末尾后 API 将再次调用以获取更多数据的逻辑。

API 调用工作正常,因为我在 Logcat.

中看到了结果

问题是在第二次调用 API 后,ListView 没有在滚动时正确更新。

例如:假设我调用 API 一次获取 7 个项目。然后在 ListView 中我会看到这样的东西:

项目 1 项目2 .. 项目7 项目1 项目2 ....

JsonObjectRequest jo = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject jsonObject) {
                        pDialog.dismiss();
                        pDialog = null;

                        try {
                            JSONArray ja = jsonObject.getJSONArray("resultset"); // id, title, content, guid

                            for (int i = 0; i < ja.length(); i++) {
                                JSONObject jo = ja.getJSONObject(i);
                                SearchListItem ri = new SearchListItem();
                                ri.setId(jo.getInt("id"));
                                ri.setTitle(jo.getString("title"));
                                ri.setContent(jo.getString("content"));
                                listy.add(ri);
                            }
                        } catch (JSONException ex) {
                            Toast.makeText(getApplicationContext(), "json ex" + ex.getMessage(), Toast.LENGTH_SHORT).show();
                            ex.printStackTrace();
                        }

                        searchAdapter.notifyDataSetChanged();
                    }

                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                pDialog.dismiss();
                pDialog = null;
                Log.d(TAG, "!!!! ERROR " + volleyError.getMessage());
            }
        });
        //Toast.makeText(ListActivity.this, jo.toString().toCharArray(), Toast.LENGTH_SHORT).show();

        AppController.getInstance().addToRequestQueue(jo);

//适配器

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.o.R;
import com.o.SearchListItem;

import java.util.List;


public class SearchListAdapter extends BaseAdapter {
    Context context;
    List<SearchListItem> items;
    //ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public SearchListAdapter(Context context, List<SearchListItem> items)
    {
        this.context = context;
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return items.indexOf(getItem(position));
    }


    class ViewHolder
    {
        TextView txtTitle;
        TextView txtContent;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);// creates the objects of all views

        if(convertView == null)
        {
            convertView = inflater.inflate(R.layout.style_row, null);

            holder = new ViewHolder();
            holder.txtTitle = (TextView) convertView.findViewById(R.id.txtAbout);
            holder.txtContent = (TextView) convertView.findViewById(R.id.txtDetail);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }
        try {
            SearchListItem rowItem = (SearchListItem) getItem(position);

            holder.txtTitle.setText(rowItem.getTitle());
            holder.txtContent.setText(rowItem.getContent().substring(0,20));
        }
        catch (Exception e){

           //Toast.makeText(SearchListAdapter.this,e.printStackTrace(),Toast.LENGTH_SHORT).show();
        }

        return convertView;
    }
}

您还没有在视图上设置标签,请执行 convertview.setTag(holder) ...

if(convertView == null)
    {
        convertView = inflater.inflate(R.layout.style_row, null);

        holder = new ViewHolder();
        holder.txtTitle = (TextView) convertView.findViewById(R.id.txtAbout);
        holder.txtContent = (TextView) convertView.findViewById(R.id.txtDetail);
convertView.setTag(holder)

    }

您的代码看起来不错,问题可能是您从服务器上的代码多次请求并且 ArrayList listy 在 jsonRequest 或您的 onResponse 方法中被多次填充服务器可能返回多个条目,发布的代码似乎没有问题。