2017-07-04 2 views
0

Ich habe ein listView, das mit einem benutzerdefinierten Adapter implementiert wird, den ich erstellte, der ein ImageView enthält. Überall auf der Liste kann jedem Gegenstand ein Bild beigefügt sein (oder nicht) (es ist nicht notwendig). Um das Bild in die Bildansicht zu laden, verwende ich Picasso-Bibliothek, in der GetView-Methode.ListView zeigt Bild in Zeilen an, die keine haben sollten

Wenn es um Zeilen geht, denen ein Bild zugeordnet ist, funktioniert mein Code gut. Das Problem ist, wenn die Liste angezeigt wird, Zeilen, die kein Bild haben sollten, zeigen eins an.

Hier ist meine getView() Methode:

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

Ich weiß, dass ich meine Informationen auch holen, da keine Informationen zwischen den Zeilen wiederholt sich außer den Bildern. Also was fehlt mir hier?

FMI Mein Adapter ist in einer verschachtelten AsyncTask erstellt, da bin ich die Informationen über eine HTTP-Verbindung holen erforderlich, bevor ich es in den Adapter einsetzen können:

@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(); 
       } 
      } 
     } 
    } 

Und ich habe eine relativ große Anzahl der zu übertragenden Informationen Ich muss diese Aufgabe mehrmals aufrufen. Beim ersten Aufruf wird der Adapter erstellt und von da an wird notifyDataSetChanged aufgerufen, um den Adapter zu aktualisieren.

Viel Hilfe geschätzt!

Ich danke Ihnen im Voraus! Prost

+0

sind, ist dies, weil Ansichten wiederverwendet Wenn Sie kein Bild für eine Zeile haben, müssen Sie das vorhandene Bild aus der Conversion-Ansicht entfernen, die Sie zuvor festgelegt haben. – maRShmallow

Antwort

0

Da Listview Recycling gleiche Ansichten, so dass Sie das Bild entfernen sollen, wenn diese Zeile nicht Bild

Sie so etwas in Ihrem getView enthält:

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

Es funktioniert. Danke vielmals! – NGSBNC

Verwandte Themen