2016-04-24 18 views
-1

私は、カスタムListViewと3 TextViewとカスタムBaseAdapterView.OnClickListenerを実装しています。Cutom ListViewとカスタムBaseAdapter onClick(View)メソッドでTextViewテキストを取得する方法

の方法でクリックされた特定のTextViewのテキストを取得する方法をいくつか試しましたが、短いと出てきました。

もし私がonClick(View)メソッドのパラメータとして得たのは、クリックされた具体的なTextViewです。どうして私はそれを正しく取得できませんか?

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(); 

    } 
} 

onClick(View)の最初のToastは私に「YouTubeのリンク」Stringを与え、第二は、私にListViewの行の1からテキストを与えることに注意してください私のLIsViewをブラウズするまで、同じテキストを毎回私に渡します。最初のブラウジングの後、Toastは同じままで、2番目の行は私に別の行のテキストを与えますTextView)。

EDIT

list_view_row_item.xml:あなたのBaseAdapter内のonClickを実装

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

を行うための最も簡単な方法です? – AndroidEnthusiast

+0

@AndroidEnthusiastこれは、この方法でよりクリーンなコードです。 – God

+0

さて、あなたの "R.layout.list_view_row" xmlが – AndroidEnthusiast

答えて

1

は、実際にこのケースでは、親のレイアウトRelativeLayoutであるあなたの行のクリックを消費しています。

実際のTextViewを取得するには、あなたが使用する必要があります。

のTextView MVIEW =(TextViewの)v.findViewById(。R.id artist_song_tv_id)。

正しいテキストを取得できます。

+0

私はそれをしました。しかし、それは私がクリックしていない行項目 'TextView'を私に与えます。 – God

+0

ビューホルダーパターンを使用していますか?可能なアダプターがビューの位置を再利用し、別の値を指定している可能性があります。 – AndroidEnthusiast

+0

ビューホルダーのパターンがありません。私が投稿したコードは、私とまったく同じコードです。だから、私は 'View'の位置を再利用しないようにアダプタを作ることができますか?実際には – God

0

これはただのonclick実装する代わりに、あなたのベースアダプタの実際のビューのためのonclickリスナーを設定しないのはなぜこの

あなたの活動に

またはフラグメント

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

私は 'OnItemClickListener'を試しましたが、だから誰かが' TextView'でうまく動作しないと私に教えてくれました。 – God

+0

私はそれを行いました。 –

+0

一口|:なぜ彼が私にここに言ったのかhttp://stackoverflow.com/questions/36814378/baseadapter-onitemclicklistener-never-called私は傾ける。 (user3419782)。 – God

関連する問題