2012-03-25 30 views
1

問題是:我如何設法將監聽器放置在LinearLayout內部的元素上,本身位於ListViewLinearLayout關於ListView和LinearLayout在列表行中的可聚焦性

具體而言,我有一個ListView,其中包含一個LinearLayout的列表,每個包含一個Button和一個TextView。我只想知道用戶是否點擊了ButtonTextView以及哪一行。

我沒有特別找代碼,但到目前爲止,我對我的ListViewOnItemListener,當我點擊,它返回LinearLayout,而不是組件英寸

回答

2

你必須執行自定義適配器並手動設置getView()方法中這些視圖的偵聽器(ButtonTextView)。要找到ButtonTextView被點擊的行,您可以首先將位置(您在getView()方法中獲得的參數)設置爲標籤,然後在偵聽器中根據視圖的標籤找出正在處理的行。方法onItemClick只會告訴你在列表中點擊了

這裏是與自定義適配器一些示例代碼:

class CustomCursorAdapter extends CursorAdapter { 

    private LayoutInflater mInflater; 
    private Context ctx; 

    public CustomCursorAdapter(Context context, Cursor c, 
      boolean autoRequery) { 
     super(context, c, autoRequery); 
     mInflater = LayoutInflater.from(context); 
     ctx = context; 
    } 

    @Override 
    public void bindView(View view, final Context context, Cursor cursor) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     String txt = cursor.getString(cursor.getColumnIndex("name")); 
     holder.text.setText(txt); 
     holder.button.setText(txt); 
     int currentPosition = cursor.getPosition(); 
     holder.text.setTag(new Integer(currentPosition)); 
     holder.button.setTag(new Integer(currentPosition)); 

     OnClickListener listener = new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       int thePosition = (Integer) v.getTag(); 
       if (v.getId() == R.id.button1) { 
        Toast.makeText(ctx, 
          "You clicked the Button from the row " 
            + thePosition + "!", Toast.LENGTH_SHORT).show(); 
       } else if (v.getId() == R.id.textView1) { 
        Toast.makeText(ctx, 
          "You clicked the TextView from the row " 
            + thePosition + "!", Toast.LENGTH_SHORT).show(); 
       }    
      } 
     }; 
     holder.text.setOnClickListener(listener); 
     holder.button.setOnClickListener(listener); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = mInflater.inflate(R.layout.adapters_cursor_adapter_clicks, 
       null); 
     ViewHolder holder = new ViewHolder(); 
     holder.text = (TextView) v.findViewById(R.id.textView1); 
     holder.button = (Button) v.findViewById(R.id.button1); 
     v.setTag(holder); 
     return v; 
    } 

    class ViewHolder { 
     TextView text; 
     Button button; 
    } 

} 

我用一個單一的OnClickListener兩個意見,你可以使用2個監聽一個爲每個視圖followinf同樣的原則。滿級+佈局文件可以在這裏找到:http://pastebin.com/uM0mb4mq(與要點可在這裏:的git://gist.github.com/2625797.git)

+0

感謝您的回答。我不能正確地實現它,但getView()的position屬性實際上是最後一個可見元素的編號,無論我在哪裏。我應該把onItemClick放在什麼元素上?我的意思是我的listView是在活動類中聲明的,所以我的監聽器在cursorAdapter類中,所以... – 2012-03-26 06:27:11

+0

@SebastienFERRAND你不太明白我的答案,我已經發布了一些示例代碼,它帶有一個自定義的'CursorAdapter'你在問什麼。 – Luksprog 2012-03-26 09:40:35

+0

當(當然)我得到標籤點擊項目時,完美的作品。謝謝。 – 2012-03-26 10:11:01

2

您必須聲明自定義適配器來做到這一點。

本教程幫了我很多: http://www.vogella.de/articles/AndroidListView/article.html#listview_adaptermodel

這裏是我的項目的一個片段。點擊時,它在ImageView中的兩個圖像之間交替。

private class EventsAdapter extends ArrayAdapter<Eveniment> { 

     private ArrayList<Eveniment> items; 

     ... 

     public OnClickListener goingClickListener2= new OnClickListener() { 
      public void onClick(View v) { 
       ((ImageView)v).setImageResource(R.drawable.going1); 
       v.setOnClickListener(goingClickListener); 
      } 
     }; 
     public OnClickListener goingClickListener = new OnClickListener() { 

      public void onClick(View v) { 
       ((ImageView)v).setImageResource(R.drawable.going2); 
       v.setOnClickListener(goingClickListener2); 
      } 
     }; 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
       View v = convertView; 
       if (v == null) { 
        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        v = vi.inflate(R.layout.listitemlayout, null); 

       } 
       if (items==null) return v; 

       Eveniment ev = items.get(position); 
       if (ev != null) { //init for each listItem 
         TextView tv_Titlu = (TextView) v.findViewById(R.id.tv_Titlu); 
         TextView tv_eventBody = (TextView)v.findViewById(R.id.tv_eventBody); 
         ImageView iv_EventPic = (ImageView)v.findViewById(R.id.iv_eventPic); 
         ImageView iv_going = (ImageView)v.findViewById(R.id.iv_going); 

         iv_going.setOnClickListener(goingClickListener);//setting the onClickListener 

         tv_Titlu.setText(ev.getEvent()); 

         ... //other initialization for each view in my layout 
       } 
       return v; 
     } 

在上面的例子中,爲每個listItem調用getView()。我通過在視圖v(每個listItem內的RelativeLayout)上調用findViewById()來訪問我的ImageVeiw

+0

感謝您的回覆。實際上,我使用了一個自定義的CursorAdapter,但是我仍然不知道如何知道linearLayout中被單擊的元素的listView中的位置,即使在教程中也是如此。 – 2012-03-26 06:32:20

相關問題