ListView数据项正在重复

时间:2015-12-09 13:15:49

标签: android android-volley

我已经使用volley实现了对JSON数据的网络调用。起初它工作正常,但现在重复列表中的数据项。在第七个列表项之后重复这些项目。如何解决错误?

ListView数据

的Item1 项目2 .. Item7 项目1 项目2 ....

它不断重复JSON数组的大小

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;
    }
}

1 个答案:

答案 0 :(得分:1)

您尚未在视图上设置标记,请执行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方法中多次填充,或者您的服务器可能返回多个条目,发布的代码似乎没有错。