Search code examples
androidlistviewpicasso

ListView displaying image on rows that shouldn't have one


I have a listView that is implemented with a custom adapter I created, which includes an imageView. Throughout the list each item may or may not have an image attached(It's not necessary). To load the image into the imageView I use Picasso library, in the getView method.

When it comes to rows that do have an image associated, my code works fine. The problem is when the list is being displayed, rows that should not have an image are displaying one.

Here is my getView() method:

public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    ReportHolder holder = null;

    if(convertView==null){
        LayoutInflater inflater=((Activity)context).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId,null);
        holder = new ReportHolder();
        holder.imageReportView=(ImageView)convertView.findViewById(R.id.reportImage);
        holder.reportLocation=(TextView) convertView.findViewById(R.id.report_location);
        holder.reportDescription=(TextView) convertView.findViewById(R.id.report_description);
        holder.reportStatus=(TextView) convertView.findViewById(R.id.report_status);
        convertView.setTag(holder);
    }
    else
        holder=(ReportHolder)convertView.getTag();

    ReportData data = reportDataList.get(position);
    holder.reportLocation.setText(data.address);
    holder.reportDescription.setText(data.description);
    holder.reportStatus.setText(data.status);
    Picasso picasso = Picasso.with(this.context);
    if(data.url!=null)
        picasso.load("https://fourth-landing-159416.appspot.com/gcs/"+data.url+"_thumbnail").into(holder.imageReportView);
    return convertView;
}

I know I'm fetching my information well because no information between rows repeats itself except the pictures. So what am I missing here?

FMI My adapter is created in a nested ASyncTask, because I´m required to fetch the information through an HTTP connection before I can insert it in the adapter:

@Override
    protected void onPostExecute(final String result) {
        mFeedTask = null;
        mFeed.removeFooterView(mProgressView);
        if(result!=null){
            if(result.contains("HTTP error code: 403")){
                Toast.makeText(mContext,"Token invalid. Please login again.", Toast.LENGTH_SHORT).show();
            }
            else if(result.equals("[]"))
                Toast.makeText(mContext,"Nothing more to show.", Toast.LENGTH_SHORT).show();
            else{
                try {
                    Gson gson = new Gson();
                    JSONArray reports = new JSONArray(result);
                    LinkedList<ReportData> tmpList = new LinkedList<ReportData>();
                    for(int i=0; i < reports.length(); i++){
                        ReportData data = gson.fromJson(reports.getString(i), ReportData.class);
                        tmpList.add(data);
                    }
                    reportDataList.addAll(tmpList);
                    if(reportDataList.size()==tmpList.size()){
                    // First, we set the empty adapter and set up the item click listeners
                    adapter = new CustomAdapter(mContext,R.layout.custom_feed_row,reportDataList);
                    mFeed.setAdapter(adapter);
                    }
                    else {
                        updateTriggered=false;
                        adapter.notifyDataSetChanged();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    }

And as I have a relatively large amount of information to transfer I have to call this task multiple times. On the first time called the adapter is created and from then on notifyDataSetChanged is called to update it.

Much Help Appreciated!

I thank you in advance! Cheers


Solution

  • Because listview recycling same views, so you should remove the image if this row shouldn't contain image

    Do something like this in your getView:

    if(data.url!=null)
            picasso.load("https://fourth-landing-159416.appspot.com/gcs/"+data.url+"_thumbnail").into(holder.imageReportView);
        else {
    holder.imageReportView.setImageDrawable(null);;
        }