2016-04-24 8 views
0

Ich erstelle eine App und habe versucht, eine ListView von Items zu definieren, die in einer XML-Datei definiert sind. Nicht so schwer, dachte ich, aber ich kam in ein sehr seltsames Problem (ich habe das nie herausgefunden) und ich weiß nicht, wie ich das lösen soll, obwohl ich auch im Forum und im Netz nachgesehen habe, ohne irgendeinen Hinweis zu finden . Ich werde hier meinen Code und das Ergebnis auf meinem Handy posten, aber, in ein paar Worten, ist mein Problem, dass meine App die Liste der Elemente erstellt und die Elemente setzt ... Aber wenn es beginnt, kann ich auf meinem Handy-Bildschirm Sie sehen nur den ersten Eintrag mit dem richtigen Text und der gesamte Text der anderen Elemente ist nicht gesetzt. Wenn ich den Bildschirm nach unten scrolle und ihn dann zurück scrolle ... Die Magie passiert! Der ganze Text ist gut eingestellt! Witze mich meine App oder gibt es einen echten Fehler in meinem Code?ListView hat den Text in der App nicht geändert

activity_list.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.mancu_000.onclickmarkerlistener.ListActivity"> 

    <ListView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/listview" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" /> 
</RelativeLayout> 

ListActivity.java

package com.example.mancu_000.onclickmarkerlistener; 

import android.content.Context; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.List; 

public class ListActivity extends AppCompatActivity { 

    private ArrayList<String> data = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list); 
     ListView lv = (ListView) findViewById(R.id.listview); 
     generateListContent(); 
     lv.setAdapter(new MyListAdapter(this, R.layout.list_layout, data)); 
    } 

    private void generateListContent() { 
     int i = 0; 
     do { 
      data.add("This is the element number " + i); 
      i++; 
     } while (i < 55); 
    } 

    private class MyListAdapter extends ArrayAdapter<String> { 

     private int layout; 

     public MyListAdapter(Context context, int resource, List<String> objects) { 
      super(context, resource, objects); 
      layout = resource; 
     } 

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

      ViewHolder mainViewHolder = null; 

      if(convertView == null) { 
       LayoutInflater inflater = LayoutInflater.from(getContext()); 
       convertView = inflater.inflate(layout, parent, false); 
       ViewHolder viewHolder = new ViewHolder(); 
       viewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail); 
       viewHolder.title = (TextView) convertView.findViewById(R.id.list_item_text); 
       viewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn); 
       viewHolder.button.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Toast.makeText(getContext(), "Button clicked for list item " + position, Toast.LENGTH_SHORT).show(); 
        } 
       }); 
       convertView.setTag(viewHolder); 
      } 
      else { 
       mainViewHolder = (ViewHolder) convertView.getTag(); 
       mainViewHolder.title.setText(getItem(position)); 
      } 

      return convertView; 
     } 
    } 

    public class ViewHolder { 
     ImageView thumbnail; 
     TextView title; 
     Button button; 
    } 
} 

list_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <ImageView 
     android:layout_width="65dp" 
     android:layout_height="65dp" 
     android:id="@+id/list_item_thumbnail" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" 
     android:src="@mipmap/ic_launcher" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New Text" 
     android:id="@+id/list_item_text" 
     android:layout_toEndOf="@+id/list_item_thumbnail" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Okay" 
     android:id="@+id/list_item_btn" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentEnd="true" /> 
</RelativeLayout> 

S o, wenn ich diese Tätigkeit beginnen, das ist, was auf dem Bildschirm passiert: First image

So, scrolle ich den Bildschirm nach unten und blättern Sie es dann wieder nach oben ... Und hier ist die Magie: Second image

Bitte Hilf mir, ich mache mir das schon seit Tagen in die Hose !!

Antwort

0

Einige der ListView Elemente haben den Standardtext, weil Sie nie den Text festlegen, wenn convertView null ist. Auch die Toast generiert, wenn Sie auf eine Button klicken, könnte falsch sein, weil Sie die Nachricht nie aktualisieren.

Sie benötigen Code wie folgt zu ändern:

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

    ViewHolder mainViewHolder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(layout, parent, false); 
     mainViewHolder = new ViewHolder(); 
     mainViewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail); 
     mainViewHolder.title = (TextView) convertView.findViewById(R.id.list_item_text); 
     mainViewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn); 

     convertView.setTag(mainViewHolder); 
    } else { 
     mainViewHolder = (ViewHolder) convertView.getTag(); 
    } 

    mainViewHolder.title.setText(getItem(position)); 
    mainViewHolder.button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getContext(), "Button clicked for list item " + position, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    return convertView; 
} 
+0

Danke Kumpel, das ist perfekt funktioniert !! Ein wirklich schätzen Sie Ihre Hilfe, Sie haben meinen Tag gemacht !! – Davide

0

nur durch den folgenden Code Ihre getView Methode ersetzen. definitiv wird es funktionieren

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

     ViewHolder viewHolder = null; 

     if(convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(layout, parent, false); 
      viewHolder = new ViewHolder(); 
      viewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail); 
      viewHolder.title = (TextView) convertView.findViewById(R.id.list_item_text); 
      viewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn); 

      convertView.setTag(viewHolder); 
     } 
     else { 
      viewHolder = (ViewHolder) convertView.getTag(); 

     } 

     viewHolder.title.setText(getItem(position)); 

     viewHolder.button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getContext(), "Button clicked for list item " + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     return convertView; 
    } 
+0

Danke Kumpel, das ist perfekt funktioniert !! Ein wirklich schätzen Sie Ihre Hilfe, Sie haben meinen Tag gemacht !! Leider kann ich nur eine Antwort mit der grünen Flagge setzen, aber deine ist genauso richtig wie die andere, ich würde auch das Grün auf deine setzen, wenn ich könnte. – Davide

Verwandte Themen