2016-04-24 3 views
-1

Ich habe eine benutzerdefinierte ListView mit 3 TextView s und eine benutzerdefinierte BaseAdapter, die View.OnClickListener implementiert.Wie TextView Text in einem Cutom ListView und einem benutzerdefinierten BaseAdapter onClick (View) -Methode

Ich versuchte einige Möglichkeiten, den Text von der spezifischen TextView, die in der onClick(View) Methode angeklickt wurde, aber kam kurz.

Wenn die View ich bekomme als Parameter der onClick(View) Methode ist die spezifische TextView, die angeklickt wurde, Warum kann ich es nicht richtig Text bekommen?

MyBaseAdapter.java:

public class MyListViewAdapter extends BaseAdapter implements View.OnClickListener 
{ 
    private Context context; 
    private ArrayList<MyListViewRow> rowsList = new ArrayList<MyListViewRow>(); // All one row items 

    private TextView songYouTubeLink; 
    private TextView b; 
    private TextView c; 

    public MyListViewAdapter(Context context,ArrayList<MyListViewRow> rowsList) 
    { 
     this.context = context; 
     this.rowsList = rowsList; 
    } 

    @Override 
    public int getCount() 
    { 
     return this.rowsList.size(); 
    } 

    @Override 
    public Object getItem(int position) 
    { 
     return this.rowsList.get(position); 
    } 

    @Override 
    public long getItemId(int position) 
    { 
     return position; 
    } 

    /** 
    * Returns a new row to display in the list view. 
    * 
    * Position - position of the current row. 
    * 
    */ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     LayoutInflater layoutInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     /** 
     * Inflating the root view and all his children and set them to a View Object. 
     * 
     */ 
     View row = layoutInflater.inflate(R.layout.list_view_row,null); 

     // Get all the views in my row 
     this.songYouTubeLink= (TextView) row.findViewById(R.id.songYouTubeLink_id); 
     this.b = (TextView) row.findViewById(R.id.b_id); 
     this.c = (TextView) row.findViewById(R.id.c_id); 

     MyListViewRow myListViewRow = rowsList.get(position); 

     // Set values to all the views in my row 
     this.songYouTubeLink.setText(myListViewRow.getSongYouTubeLinkText()); 
     this.b.setText(myListViewRow.getB()); 
     this.c.setText(myListViewRow.getC()); 

     // Setting on click listeners 
     this.songYouTubeLink.setOnClickListener(this); 
     //this.b.setOnClickListener(this); 

     return row; 
    } 


    @Override 
    public void onClick(View v) 
    { 
     Toast.makeText(context, "onClick LV Adapter called", Toast.LENGTH_SHORT).show(); 


     TextView tv = (TextView) v; 
     Toast.makeText(context, tv.getText().toString(), Toast.LENGTH_SHORT).show(); 
     Toast.makeText(context, this.a.getText().toString(), Toast.LENGTH_SHORT).show(); 

    } 
} 

Die erste Toast in onClick(View) gibt mir "YouTube-Link" String und die zweite gibt mir einen Text aus dem 1 der Reihen des ListView (Beachten Sie, dass die zweite Toast gib mir immer den gleichen Text, bis ich meine LIsView durchsuchen. Nach dem Surfen bleibt die erste Toast gleich und die zweite gibt mir einen Text von einer anderen Zeile TextView).

EDIT:

list_view_row_item.xml:

<?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"> 

    <!-- Artist name and song name --> 
    <TextView 
     android:id="@+id/artist_song_tv_id" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="16dp" 
     android:layout_marginBottom="3dp" 
     /> 

    <!-- Song youtube link --> 
    <TextView 
     android:id="@+id/youtube_link_tv_id" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="16dp" 
     android:layout_below="@id/artist_song_tv_id" 
     android:layout_marginBottom="3dp" 
     /> 

    <!-- Song shazam link --> 
    <TextView 
     android:id="@+id/shazam_link_tv_id" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="16dp" 
     android:layout_below="@id/artist_song_tv_id" 
     android:layout_toRightOf="@id/youtube_link_tv_id" 
     android:layout_marginBottom="5dp" 
     /> 

</RelativeLayout> 
+0

Warum nicht einfach einen Onclick Zuhörer für die aktuelle Ansicht anstelle des Basis Adapterset Umsetzung Onclick ? – AndroidEnthusiast

+0

@AndroidEnthusiast Weil es auf diese Weise einen saubereren Code gibt. – God

+0

Okay ... Bitte laden Sie, was Ihre "R.layout.list_view_row" xml wie – AndroidEnthusiast

Antwort

1

onClick in Ihrem BaseAdapter Implementierung verbraucht tatsächlich das Klicken Ihrer Reihe, die übergeordnete Layout RelativeLayout in diesem Fall ist.

Um die tatsächliche Textview zu erhalten, sollten Sie verwenden:

Textview MVIEW = (Textview) v.findViewById (. R.id artist_song_tv_id);

Dann können Sie den richtigen Text erhalten.

+0

habe ich das getan. Aber es gibt mir ein Zeilenelement 'TextView', auf das ich nicht geklickt habe. – God

+0

Verwenden Sie ein beliebiges Ansichtshalter-Muster? Es ist möglich, dass Ihr Adapter die Positionen der Ansichten wieder verwendet und einen anderen Wert angibt. – AndroidEnthusiast

+0

Kein Ansichtshalter-Muster. Der Code, den ich gepostet habe, ist derselbe Code wie ich. Also kann ich den Adapter dazu bringen, die Positionen der 'View's nicht wiederzuverwenden? – God

0

Dies ist der einfachste Weg, um dieses

In Ihrer Tätigkeit oder ein Fragment zu tun

listView=(ListView)findViewById(R.id.listview); 
    listView.setAdapter(hotelAdapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
      Hotel hotel = (Hotel) arg0.getItemAtPosition(position); 

}

+0

Ich versuchte 'OnItemClickListener', aber jemand in SO sagte mir, es wird nicht mit einem' TextView' so funktionieren. – God

+0

Ich habe es getan und es funktioniert. –

+0

Seufz |: Also warum hat er mir hier http://stackoverflow.com/questions/36814378/baseadapter-onitemclicklistener-never- genannt ich kann nicht. (Benutzer3419782). – God

Verwandte Themen