2017-02-20 1 views
0

Pour le ci-dessous, je l'ai ajouté le toast suivant:Mise à jour: Obtenir un toast pour un ListView avec des images sur Android App

public void Toast (View v) { 
    Toast.makeText(this, "Test", Toast.LENGTH_LONG).show(); 
} 

Il fonctionne, mais évidemment tout ce qu'il ne fait qu'afficher pour tout « Test ». Je pensais que je serais capable de faire 'this.dogTitles' ou 'this.dogDescriptions' mais ça ne me le permettrait pas.

Quelqu'un peut-il expliquer pourquoi? Je l'ai placé dans la méthode onCreate.

Merci

Je ne parviens pas à travailler sur la façon de programmer un toast à chaque fois qu'un élément de la liste (ligne) est cliqué.

Je peux faire des toasts pour des programmes simples, mais j'ai du mal à trouver une solution de ce genre à cause des adaptateurs de tableau.

Mon code est ci-dessous.

Merci d'avance.

package lab.mad.cct.c3375331task2; 

import android.content.Context; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 

public class Task2Activity extends AppCompatActivity { 

ListView list; 
String [] dogTitles; 
String [] dogDescriptions; 
int[] images = {R.drawable.husky, R.drawable.pug, R.drawable.yorkshire_terrier, R.drawable.french_bulldog, 
R.drawable.border_collie, R.drawable.great_dane, R.drawable.staffordshire_bull_terrier, R.drawable.golden_retriever, 
R.drawable.german_shepherd, R.drawable.doberman}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_task2); 

    Resources res = getResources(); 
    dogTitles = res.getStringArray(R.array.titles); 
    dogDescriptions = res.getStringArray(R.array.descriptions); 

    list = (ListView) findViewById(R.id.listView); 
    dogAdapter adapter = new dogAdapter(this, dogTitles, images, dogDescriptions); 
    list.setAdapter(adapter); 
} 
} 

class dogAdapter extends ArrayAdapter<String> 
{ 
    Context context; 
int[] images; 
String[] titleArray; 
String[] descriptionArray; 
dogAdapter(Context c, String[] titles, int imgs[], String[] desc) 
{ 
    super(c, R.layout.single_row, R.id.largeText, titles); 
    this.context = c; 
    this.images = imgs; 
    this.titleArray = titles; 
    this.descriptionArray = desc; 
} 

class MyViewHolder 
{ 
    ImageView myImage; 
    TextView myTitle; 
    TextView myDescription; 
    MyViewHolder(View v) 
    { 
     myImage = (ImageView) v.findViewById(R.id.imageView); 
     myTitle = (TextView) v.findViewById(R.id.largeText); 
     myDescription = (TextView) v.findViewById(R.id.smallText); 
    } 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    MyViewHolder holder = null; 
    if (row == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = inflater.inflate(R.layout.single_row, parent, false); 
     holder = new MyViewHolder(row); 
     row.setTag(holder); 
     Log.d("dogs", "Creating a new row"); 
      } 
    else { 
     holder = (MyViewHolder) row.getTag(); 
     Log.d("dogs", "Recycling stuff"); 
    } 
    //ImageView myImage = (ImageView) row.findViewById(R.id.imageView); 
    //TextView myTitle = (TextView) row.findViewById(R.id.largeText); 
    //TextView myDescription = (TextView) row.findViewById(R.id.smallText); 

    holder.myImage.setImageResource(images[position]); 
    holder.myTitle.setText(titleArray[position]); 
    holder.myDescription.setText(descriptionArray[position]); 

    row.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast toast = new Toast(getContext()); 
      toast.setDuration(Toast.LENGTH_LONG); 
      toast.show(); 
     } 
    }); 

    return row; 
} 
} 
+0

'this' se réfère à l'objet courant et change ce qu'il fait référence en fonction de l'endroit où il est appelé. J'ai mis à jour ma réponse pour montrer comment vous pouvez obtenir les valeurs des tableaux mais vous pouvez également obtenir les valeurs de l'adaptateur si nécessaire. –

Répondre

0

À l'intérieur de l'onCreate après avoir défini l'adaptateur, placez un OnClickListener après de la liste.

list.setOnClickListener 

puis à l'intérieur d'onClick, ajoutez un Toast comme vous le feriez normalement.

Si vous le souhaitez à partir d'un widget spécifique dans la rangée, utilisez ce même widget pour la liste. Faites ceci dans l'adaptateur, cependant. Faites-le après votre holder.myDescription.setText

textView.setOnClickListener 

et sur son onCreate placer votre pain grillé à l'intérieur.

+0

Je ne pensais pas que c'était aussi simple que @AdamGardner. Je veux qu'il soit capable de cliquer n'importe où sur la ligne pour obtenir le toast. En faisant comme je le sais, je devrais utiliser l'une des boîtes de texte ou l'image. Comment ferais-je cela? –

+0

c'est, @PhilAdams. Vous pouvez définirOnClickListener sur la ligne, la liste ou les widgets individuels qui composent votre ligne si vous le souhaitez. –

0

Vous serez en mesure de traiter spécifiquement par ligne un toast en procédant comme suit dans votre méthode getView() du ArrayAdapter

row.setOnClicklistener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     //display toast here 
    } 
}); 
0

l'intérieur de votre onCreate ajouter un OnItemClickListener à votre ListView. OnIemClickListener est intégré dans ListView pour fournir une interaction de clic avec chaque élément de ligne dans votre ListView.

l'intérieur de votre onCreate:

list = (ListView) findViewById(R.id.listView); 
dogAdapter adapter = new dogAdapter(this, dogTitles, images, dogDescriptions); 
list.setAdapter(adapter); 

list.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 

     // Use the clicked item's position to get the corresponding values 
     // from arrays, adapter, etc. 
     Toast.makeText(getContext(), dogTitles[position] + " " + dogDescriptions[position], Toast.LENGTH_LONG) 
       .show(); 
    } 
}); 
+0

Je ai du mal à comprendre où placer cela comme j'ai essayé plusieurs choses, mais en vain –

+0

@PhilAdams Placez 'list.setOnItemClickListener()' après 'list.setAdapter()' –

0
row.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Toast.makeText(context, ""+position, Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

Upvote réponses si vous trouvez une solution à partir de cela. –

0

Vous havent attribué une vue de Toast Votre clic fonctionne, mais des toasts n'affiche pas. moyen simple pour afficher des toasts

Toast.makeText(this, "Android Simple Toast", Toast.LENGTH_LONG).show(); 

Selon votre code, vous devez définir un point de vue de porter un toast comme ce toast .xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/toast_layout_root" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:padding="10dp" 
android:background="#DAAA" > 

<TextView android:id="@+id/text" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:textColor="#FFF" /> 

ensuite dans votre clic sur

LayoutInflater inflater = getLayoutInflater(); 
View layout = inflater.inflate(R.layout.toast_layout, 
           (ViewGroup) findViewById(R.id.toast_layout_root)); 
TextView text = (TextView) layout.findViewById(R.id.text); 
text.setText("Hello! This is a custom toast!"); 

Toast toast = new Toast(getApplicationContext()); 
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
toast.setDuration(Toast.LENGTH_LONG); 
toast.setView(layout);//this you missed 
toast.show();