Android 应用中 GridView 中的数据不同

Data varying in GridView in Android App

我正在开发一个显示不同历史地点信息的 Android 应用程序。在我的应用程序中,我制作了一个页面来审查和评价这个地方。该应用程序正在从数据库中检索用户名、评分和评论,并将其显示在 GridView 中。它显示了正确数量的评论,但它没有显示所有评论,而是复制了一些评论。这是我从数据库中检索数据的代码。

谁能告诉我我的代码有什么问题??

class task extends AsyncTask<String, String, Void>
{
    private ProgressDialog progressDialog = new ProgressDialog(Comments.this);
    InputStream is = null ;
    String result = "";
    protected void onPreExecute() 
    {
        if (get)
            progressDialog.setMessage("Retrieving reviews...");
        else
            progressDialog.setMessage("Posting review...");

       progressDialog.show();
       progressDialog.setOnCancelListener(new OnCancelListener() 
       {
           @Override
           public void onCancel(DialogInterface arg0) 
           {
               task.this.cancel(true);
           }
       });
    }

    @Override
    protected Void doInBackground(String... params) 
    {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url_select);

        try 
        {
            httpPost.setEntity(new UrlEncodedFormEntity(param));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();

            //read content
            is =  httpEntity.getContent();  
        } 
        catch (Exception e) 
        {
            Log.e("log_tag", "Error in http connection "+e.toString());
        }

        try 
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            String line = "";
            while((line=br.readLine())!=null)
            {
               sb.append(line+"\n");
            }
            is.close();
            result=sb.toString();
        } 
        catch (Exception e) 
        {
            // TODO: handle exception
            Log.e("log_tag", "Error converting result "+e.toString());
        }
            return null;
    }


    protected void onPostExecute(Void v) 
    {
        try 
        {
            if(get)
            {
                name=new ArrayList<String>();
                comment=new ArrayList<String>();
                rating=new ArrayList<Float>();
                JSONArray Jarray = new JSONArray(result);

                for(int i=0;i<Jarray.length();i++)
                {
                    JSONObject Jasonobject = new JSONObject();
                    Jasonobject = Jarray.getJSONObject(i);

                    String names=null;
                    names=Jasonobject.getString("name");

                    name.add(names);
                    comment.add(Jasonobject.getString("comment"));
                    rating.add((float)Jasonobject.getDouble("rating"));
                }
                CustomGrid adapter = new CustomGrid(Comments.this, name,comment,rating);                        
                grid.setAdapter(adapter);

                get=false;
            }
        progressDialog.dismiss();               
        } 
        catch (Exception e) 
        {
            // TODO: handle exception
            Log.e("log_tag", "Error parsing data "+e.toString());
        }
    }
}

适配器代码:

    public class CustomGrid extends BaseAdapter

    {
        private Context mContext;
        private final ArrayList<String> name;
        private final ArrayList<String>  comment;
        private final ArrayList<Float> rating; 

        public CustomGrid(Context c,ArrayList<String>  name, ArrayList<String>  comment, ArrayList<Float> rating ) 
        {
            mContext = c;
            this.name= name;
            this.comment =  comment;
            this.rating=rating;
        }


    @Override
    public int getCount() 
    {
      // TODO Auto-generated method stub
      return comment.size();
    }


    @Override
    public Object getItem(int position) 
    {
      // TODO Auto-generated method stub
      return null;
    }


    @Override
    public long getItemId(int position) 
    {
      // TODO Auto-generated method stub
      return 0;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        // TODO Auto-generated method stub
        View grid;
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) 
        {
            grid = new View(mContext);
            grid = inflater.inflate(R.layout.grid, null);
            TextView textName = (TextView) grid.findViewById(R.id.grid_name);
            TextView textComment = (TextView) grid.findViewById(R.id.grid_comment);
            RatingBar ratingBar1 = (RatingBar)grid.findViewById(R.id.grid_rating);
            textName.setText(name.get(position));
            textComment.setText(comment.get(position));
            ratingBar1.setRating(rating.get(position));
        } 
        else 
        {
            grid = (View) convertView;
        }
            return grid;
        }
}

convertView 只有一次为 null。在你膨胀并 return 它之后,由于 GridView/ListView 的回收机制,它永远不会再为 null 。您正在做的是将位置 0 处的数据集内容分配给 TextView,然后 return 一遍又一遍地分配具有相同内容的合并视图。将您的 getView 更改为:

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

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.grid, null);    
    } 
    TextView textName = (TextView) convertView.findViewById(R.id.grid_name);
    TextView textComment = (TextView) convertView.findViewById(R.id.grid_comment);
    RatingBar ratingBar1 = (RatingBar)convertView.findViewById(R.id.grid_rating);
    textName.setText(name.get(position));
    textComment.setText(comment.get(position));
    ratingBar1.setRating(rating.get(position));
    return convertView;
}

您可能还想查看 ViewHolder 模式,这会使您的 GridView/ListView 滚动更平滑