2016-01-19 13 views
0

Je suis débutant absolu au studio android. J'apprends maintenant sur la vue de liste. Lorsque j'utilise la vue liste avec un simple adaptateur de tableau. Il montre bien. Maintenant, j'essaie de créer un adaptateur personnalisé avec une disposition de ligne personnalisée. Mais quand je lance l'application. Ce n'est pas une erreur de lancer. Mais l'activité ne montre rien à l'écran. Je viens de recevoir l'écran vide et aucune donnée n'est liée à la liste. S'il vous plaît Quel est le problème avec mon code? S'il vous plaît, est-ce correct?Pourquoi ListView avec adaptateur personnalisé ne montrant rien?

C'est ma classe d'activité

public class CustomAdapterActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { 
     super.onCreate(savedInstanceState, persistentState); 
     setContentView(R.layout.custom_adapter); 

     ListItem item_1 = new ListItem(); 
     item_1.Name = "Name 1"; 
     item_1.Email = "Email 1"; 
     item_1.Phone = "Phone 1"; 

     ListItem item_2 = new ListItem(); 
     item_1.Name = "Name 2"; 
     item_1.Email = "Email 2"; 
     item_1.Phone = "Phone 2"; 

     ListItem item_3 = new ListItem(); 
     item_1.Name = "Name 3"; 
     item_1.Email = "Email 3"; 
     item_1.Phone = "Phone 3"; 

     ListItem item_4 = new ListItem(); 
     item_1.Name = "Name 4"; 
     item_1.Email = "Email 4"; 
     item_1.Phone = "Phone 4"; 

     ListItem[] items = { item_1 , item_2,item_3 , item_4 }; 

     ArrayAdapter adapter = new ArrayAdapter<ListItem>(this,R.layout.custom_row,items); 
     ListView listView = (ListView)findViewById(R.id.custom_listview); 
     listView.setAdapter(adapter); 
    } 
} 

Ceci est ma classe de modèle de ligne nommé ListItem

public class ListItem { 

    public String Name; 
    public String Email; 
    public String Phone; 

} 

Ceci est la mise en page principale

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

    <ListView 
     android:id="@+id/custom_listview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"></ListView> 
</LinearLayout> 

C'est la mise en page pour la ligne.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <TextView 
     android:text="name" 
     android:id="@+id/row_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="30dp"/> 

    <TextView 
     android:layout_below="@+id/row_name" 
     android:id="@+id/row_email" 
     android:text="email" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="30dp"/> 

    <TextView 
     android:layout_below="@+id/row_email" 
     android:id="@+id/row_phone" 
     android:text="phone" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="30dp"/> 
</RelativeLayout> 

Ceci est ma classe d'adaptateur personnalisé.

public class MyCustomAdapter extends ArrayAdapter<ListItem> { 
    private final Context context; 
    private final ListItem[] values; 

    public MyCustomAdapter(Context context,ListItem[] values) 
    { 
     super(context,-1,values); 
     this.context = context; 
     this.values = values; 
    } 

    @Override 
    public View getView(int position,View convertView,ViewGroup parent) 
    { 
     LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.custom_row, parent, false); 
     TextView name_tf = (TextView)rowView.findViewById(R.id.row_name); 
     TextView email_tf = (TextView)rowView.findViewById(R.id.row_email); 
     TextView phone_tf = (TextView)rowView.findViewById(R.id.row_phone); 
     name_tf.setText(values[position].Name); 
     email_tf.setText(values[position].Email); 
     phone_tf.setText(values[position].Phone); 
     return rowView; 
    } 
} 

Alors s'il vous plaît ce qui ne va pas avec mon code? Aucune donnée n'est liée à ListView pendant que j'exécute l'application.

Puis j'ai suivi à Sankar V réponse. Ça a marché. Mais il a encore un léger problème comme dans l'image

enter image description here

Pourquoi ne item_4 est à lier LISTVIEW s'il vous plaît?

+0

Le problème que vous créez 4 objets différents, mais la valeur de réglage pour seulement item_1 qui est remplacé à chaque fois et les dernières données d'article est affiché. –

+0

Comment dois-je le modifier? Je pense que je mets de la valeur pour chaque rangée. Par exemple, comme name_tf.setText (valeurs [position] .Name). Comment puis-je le corriger? –

+0

Vérifier ma mise à jour –

Répondre

1

S'il vous plaît utiliser la version public void onCreate(Bundle savedInstanceState) de la méthode onCreate au lieu de public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)

Ce dernier est disponible uniquement dans Lollipop et plus.

Et également de créer l'instance de MyCustomAdapter au lieu du ArrayAdapter générique.

ArrayAdapter adapter = new MyCustomAdapter<ListItem>(this,R.layout.custom_row,items); 

Définissez correctement les données. Vous créez 4 objets différents mais vous ne définissez des valeurs que pour le premier objet. Changez-le comme ci-dessous

 ListItem item_1 = new ListItem(); 
     item_1.Name = "Name 1"; 
     item_1.Email = "Email 1"; 
     item_1.Phone = "Phone 1"; 

     ListItem item_2 = new ListItem(); 
     item_2.Name = "Name 2"; // This need to be changed from item_1 to item_2 
     item_2.Email = "Email 2"; // This need to be changed from item_1 to item_2 
     item_2.Phone = "Phone 2"; // This need to be changed from item_1 to item_2 

     ListItem item_3 = new ListItem(); 
     item_3.Name = "Name 3"; // This need to be changed from item_1 to item_3 
     item_3.Email = "Email 3"; // This need to be changed from item_1 to item_3 
     item_3.Phone = "Phone 3"; // This need to be changed from item_1 to item_3 

     ListItem item_4 = new ListItem(); 
     item_4.Name = "Name 4"; // This need to be changed from item_1 to item_4 
     item_4.Email = "Email 4"; // This need to be changed from item_1 to item_4 
     item_4.Phone = "Phone 4"; // This need to be changed from item_1 to item_4 
+0

Oui, je l'ai changé. Ensuite, il jette l'erreur. –

+0

cela fonctionne-t-il après avoir créé l'instance en utilisant MyCustomAdapter? Pouvez-vous s'il vous plaît ajouter le logcat? –

+0

Oui. Ça marche. Mais ayant des problèmes. Je vais poster la capture d'écran.Seules les données item_4 sont liées à listview. –