2009-11-12 5 views
7

J'ai codé un propre adaptateur et l'a ajouté à mon ListActivity via un ListView. La raison pour laquelle j'ai écrit un propre adaptateur est, que j'ai dû faire quelques changements de disposition à la liste-entrys. Dans chaque entrée de la liste, j'ai 3 TextViews.Android, Custom ListAdapter obtenir TextView-Text

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="?android:attr/listPreferredItemHeight" 
android:padding="6dip"> 
<TextView 
    android:id="@+id/myNr" 
    android:layout_width="40dip" 
    android:layout_height="fill_parent" 
    android:layout_marginRight="15dip" 
    android:text="id" 
    android:textSize="25dip" 
    android:background="#333333" 
    android:gravity="center_horizontal"/> 
<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="0dip" 
    android:layout_weight="1" 
    android:layout_height="fill_parent"> 
    <TextView 
     android:id="@+id/editor" 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" 
     android:gravity="center_vertical" 
     android:text="Editor: " /> 
    <TextView 
     android:id="@+id/date" 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" 
     android:singleLine="true" 
     android:ellipsize="marquee" 
     android:text="Date: " /> 
</LinearLayout> 

La prochaine chose que je l'ai fait, était de mettre en œuvre un "onListItemClick-Methode". Par la suite je mis en place un onListItemLongClick - Listener avec le code suivant:

dans onCreate de l'activité i ajouté:

registerForContextMenu(getListView()); 

alors j'ajouté la Methode suivante:

Override 
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo){ 
     AdapterView.AdapterContextMenuInfo info; 
     info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
      long id = getListAdapter().getItemId(info.position); 
     } 

où "id" est l'index de l'article dans la liste. Je veux maintenant obtenir le texte du texview avec l'id = "myNr de ce ListItem. Est-il possible obtenir ce texte?

Répondre

6

Hey Guys J'ai trouvé une autre façon de définir une ItemLongClickListener. Par conséquent, j'ai également trouvé un moyen d'obtenir le texte que je montre.

ListView lv = getListView(); 
lv.setOnItemLongClickListener(new OnItemLongClickListener(){ 
@Override 
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int row, long arg3) { 
    String[] tmp = (String[]) arg0.getItemAtPosition(row); 
    //tmp[0] ist the Text of the first TextView displayed by the clicked ListItem 
    return true; 
    }}); 
18

view est l'élément de la liste, de sorte que vous pouvez faire

String s =(String) ((TextView) view.findViewById(R.id.myNr)).getText(); 
+0

Si simple et cela fonctionne. Merci. :) –

0

Oui, je le pensais aussi, mais quand je l'implémente, je reçois le texte du premier TextView dans la liste, ce qui signifie que je peux obtenir le texte du TextView désiré, mais c'est toujours le texte de la première entrée de liste. N'est-il pas possible d'adresser l'entrée longClickedList?

2

Si vous cherchez le TextView au posi tion de l'élément de la personne à long pressé, vous pouvez l'obtenir à l'aide de quelque chose comme ceci:

String s = ((TextView) view.getItemAtPosition(info.position)).getText(); 
0

Merci pour votre aide, mais je crains qu'il ne fonctionne toujours pas. si j'ajouter la ligne que vous suggérez, il souligne « getItemAtPosition » et dit: --Le méthode getItemAtPosition (int) est non défini pour le type View--

Il suggère de jeter la vue d'une AdapterView, il regarde les éléments suivants:

String s = ((TextView) ((AdapterView<ListAdapter>) view).getItemAtPosition(info.position)).getText(); 

Quand je lance cela et faire un clic long sur l'élément, je reçois un « ClassCastException »

0

Dans cette méthode, vous obtiendrez l'élément lié à votre élément de liste.

@Override 
public boolean onContextItemSelected(MenuItem aItem) { 
    AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) aItem.getMenuInfo(); 
    Object entity = (Object) todoList.getAdapter().getItem(menuInfo.position); 
    switch (aItem.getItemId()) {} 
} 
9

prendre simplement référence de la vue texte si vous l'extension d'un BaseAdapter comme

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

TextView tx =(TextView)view.findViewById(R.id.text); 
      String s = tx.getText().toString(); 
      Log.d(TAG, "string : "+s); 
0
list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
      String title = (String) ((TextView)view.findViewById(R.id.title)).getText(); 
       String artist=(String)((TextView)view.findViewById(R.id.artist)).getText(); 

        //System.out.println(s); 
         Toast.makeText(CustomizedListView.this,"Title = "+title+"\n"+"Artist = "+artist, Toast.LENGTH_SHORT).show();        

     } 
    });  
4

J'ai trouvé aucune des solutions ci-dessus pour travailler.En tant que alternatif vous pouvez:

getListView().setOnItemLongClickListener(new OnItemLongClickListener() 
{ 

    public boolean onItemLongClick(AdapterView<?> arg0, View v,int position, long id) 
    { 

    Cursor c = (Cursor) arg0.getItemAtPosition(position); 
    String tableValue = c.getString(1); 

     return true; 
    } 
}); 
0

J'ai eu un ArrayList de ArrayLists comme ma source de données pour le CustomAdapter, donc j'utilise

menu.setHeaderTitle(Messages.get(info.position).getUserName()); 
0

utilisant HashMap

getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      HashMap m = (HashMap) getListView().getItemAtPosition(position); 
      System.out.println("itemClick: position = " + position + ", id = " + id + " o = " + m.get("YOUR_KEY")); 
     } 
    }); 
3

Le meilleur solution que j'ai trouvé était:

@Override 
     public void onCreateContextMenu(ContextMenu menu, View view,ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, view, menuInfo); 
     AdapterView.AdapterContextMenuInfo info =  (AdapterView.AdapterContextMenuInfo)menuInfo; 

     ViewGroup vg = (ViewGroup) view; 
     View children = vg.getChildAt(info.position); 
     TextView child = (TextView) children.findViewById(R.id.text1); 

     String s= child.getText().toString(); 
      menu.setHeaderTitle(s); 
      menu.add(0, view.getId(), 0, "Serve"); 
      menu.add(0, view.getId(), 0, "View"); 

     } 
Questions connexes