2012-06-22 2 views
13

두 개의 단추가있는 사용자 지정 ListView가 있습니다. 각 행의 단추 하나를 클릭하면 목록보기에서 텍스트 레이블을 얻고 싶습니다. 그것으로. 지금까지 아무 것도 작동하지 않고 배열에서 마지막 항목을 계속 가져 왔습니다. 여기 Android : 사용자 지정 목록보기에서 클릭 한 목록보기 항목 가져 오기

내 사용자 지정 ListView에 대한 내 어댑터 서브 클래스 당신에게 내가 여기 enter image description here

을 무엇을 의미하는지의 더 나은 아이디어를 줄 수있는 스크린 샷입니다

static final String[] Names = 
      new String[] { "John", "Mike", "Maria", "Miguel"}; 


class MyArrayAdapter extends ArrayAdapter<String> { 
    private final Context context;  

    int which; 

    public MyArrayAdapter(Context context, String[] pValues) { 
     super(context, R.layout.main, pValues); 
     this.context = context; 
     values = pValues; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     rowView = inflater.inflate(R.layout.main, parent, false); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.logo); 
     Button call = (Button) rowView.findViewById(R.id.button1); 
     Button chat = (Button) rowView.findViewById(R.id.button2); 
     textView.setText(values[position]); 


     // Change icon based on name 
     s = values[position];   
     which = position; 
     call.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       String name = values[which]; 
       Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     return rowView; 
    } 
} 

편집 :

String name = textView.getText().toString(); 
RelativeLayout ll = (RelativeLayout)v.getParent(); 
textView = (TextView)ll.findViewById(R.id.label); 
Toast.makeText(CustomListView.this, name, 
Toast.LENGTH_SHORT).show(); 
+0

'values ​​[which] '대신'textView.getText(). toString()'을 사용하십시오. –

답변

14

쉽게 할 수 있습니다 : 당신이 ListActivity를 가지고 있고, 당신이 당신의 자신의 어댑터를 사용하지 않는 경우

call.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      RelativeLayout rl = (RelativeLayout)v.getParent(); 
      TextView tv = (TextView)rl.findViewById(R.id.label); 
      String text = tv.getText().toString(); 
      Toast.makeText(CustomListView.this, text, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
+0

XML에서 상대 레이아웃을 사용했습니다. 이 작업을 수행했지만 몇 가지 개선 사항이 있지만 각 단추를 처음 클릭하면 이전 TextView의 값을 얻은 다음 올바른 값을 얻습니다. 로그캣 : 06-22 14 : 28 : 29.279 : W/Resources (14841) : 문자열로 변환 : TypedValue {t = 0x12/d = 0x0 a = 3 r = 0x7f050002} – Amanni

+0

그럴 필요는 없습니다. 위 코드가 부모 (행)를 찾기 위해 클릭 한 버튼을 사용하고 그런 다음 형제 텍스트 뷰를 찾는 데 사용하기 때문에 발생합니다 ... 지금 코드를 표시하도록 게시물을 편집 할 수 있습니까? – Barak

+0

지금 내 게시물을 편집했습니다. 나는 그것이 효과가 있다고 믿기 때문에 나는 놀랐다. – Amanni

5

보기의 setTag 속성 사용 ..............

Button call = (Button) rowView.findViewById(R.id.button1); 
call.setTag(position); 

call.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       int which = -1; 
       Obejct obj = v.getTag(); 
       if(obj instaceof Integer){ 
       which = ((Integer)obj).intValue(); 
        } 

       if(which >-1){ 
       String name = values[which]; 
       Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
+0

와우,이 효과가 있습니다. 당신이 정확히 무엇을하고 있는지 정확히 설명해 주시겠습니까 – Amanni

+0

기본적으로 모든 뷰는 setTag를 사용하여 객체를 유지할 수 있습니다. 그 행의 각 버튼이있는 태그의 위치를 ​​설정하고 onClick (동일한 버튼 임)에서 View를 얻을 때 그 특정 단추에서 태그를 되 찾으십시오 ......... –

+1

고맙습니다. – Amanni

3

, 당신은 여전히 ​​수 탭 된 버튼에 속한 목록 항목을 다음과 같이 가져옵니다.

목록 행의 레이아웃 파일에서 0

:

당신의 ListActivity에서
<ImageButton 
     android:id="@+id/button_call" 
     android:layout_height="48dip" 
     android:layout_width="48dip" 
     android:contentDescription="Call" 
     android:onClick="callBuddy" 
     android:src="@drawable/call_button_image" 
     /> 

:

public void callBuddy(View view) { 

    int position = getListView().getPositionForView((View) view.getParent()); 
    Buddy buddyToCall = (Buddy) getListView().getItemAtPosition(position); 

    Toast.makeText(MyListActivity.this, String.format("Calling your buddy %s.", buddyToCall.name), Toast.LENGTH_SHORT).show(); 

} 
0

세트의 onclick = ... 버튼/이미지/등의 XML에 "클릭"

당신의 활동에 수행

public void click(View v) { 
    final int position = getListView().getPositionForView(v); 
    String text = getListView().getItemAtPosition(position).toString(); 
    Toast.makeText(getApplicationContext, text, Toast.LENGTH_SHORT).show(); 
} 
+0

와우는 너무 단순 해 보인다. 다른 것을 정의 할 필요가 없다? getListView() 또는 position이 무엇인가 –

+0

마지막 int 위치 = getListView(). getPositionForView (v); –

0

단지의 getItem을 (사용) 및 위치를 통과 예 : getItem(position).getID() getID() 메소드는 getter 메소드입니다.

관련 문제