2012-12-03 8 views
1

이 문제를 해결하기 위해 이미 많은 시간을 보냈습니다.이 주제에 대한 다른 많은 StackOverflow 게시물을 보았지만 나에게 도움이되는 해결책을 찾을 수 없었습니다.ButtonList가있는 사용자 정의 Listview 이벤트 리스너

나는 ListActivity와 사용자 지정 ArrayAdapter를 가지고 있습니다. 내 listview에는 삭제 단추와 같은 몇 가지 단추가 있습니다. 그러나 onItemClick 메서드는 목록의 TextView를 클릭 한 경우에만 호출됩니다. 버튼에 OnClickListeners를 추가 할 수 있지만 버튼이 속한 요소의 위치를 ​​모르는 문제가 있습니다. 모든 단추 하나 하나에 태그를 설정할 수는 있지만 더 좋은 방법이 있어야합니다! 누군가가 나에게 이것에 대한 최상의 솔루션을 말할 수 있다면

private class ItemListAdapter extends ArrayAdapter<Item> { 
    private ArrayList<Item> items; 
    private int countItems = 0; 

    public ItemListAdapter(Context ctx, int textViewResourceId, ArrayList<Item> itemList){ 
     super(ctx, textViewResourceId, itemList); 
     this.items = itemList; 
     this.countItems = itemList.size(); 
    } 

    public int getCount(){ 
     return countItems; 
    } 

    public Item getItem(int pos){ 
     return itemList.get(pos); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 

     //Get the current list item 
     final Item currentItem = itemList.get(position); 

     if (row == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = vi.inflate(R.layout.itemlist_item_row, null); 
     } 
     Item item = items.get(position); 
     if (item != null){ 
      TextView bt = (TextView) row.findViewById(R.id.bt_itemlist_item); 
      if (bt != null){ 
       bt.setText(item.getName()); 
      } 
     } 
     return row; 
    } 

} 

이 좋은 것 :

내 어댑터입니다.

답변

0

getView()Buttons에 대한 OnClickListeners를 설정하고 당신은 당신이 삭제 버튼에 대한 참조를 가져 해달라고 왜 당신이 한

+0

어떻게 위치에 액세스 할 수 있습니까? getView 메서드 내에서 새로운 익명 OnClickListener를 만들면 위치를 읽을 수 없습니다. 나는 얻는다 : 다른 방법으로 정의 된 내부 클래스 내부의 비 최종 변수 위치를 참조 할 수 없다. – friday

+0

서명에서 최종 위치를 설정할 수있다. 컴파일러는 당신을 차단하지 않을 것입니다 – znat

+0

흠은 그 전에 시도해 볼 수 있습니다 : S Nathan에게 고마워요,이게 완벽하게 작동합니다! – friday

0

것처럼 bt.setText (item.getName()), 다음 설정된 위치를 얻을 수 있습니다 그것을 클릭 청취자. getView 메소드에 클릭 리스너를 추가하면 행의 위치가 자동으로 표시됩니다.

0

여기 하나의 접근 방법이 있습니다. 보기의 태그를 설정하는 것은 일반적이지만 많은보기의 태그를 설정하지 않으려면 가능한 경우 상위를 사용하십시오. 반환하는 변수 row의 경우 태그를 currentItem으로 설정합니다. 그렇지 않으면 각 클릭 가능한보기의 태그를 설정하기 만하면됩니다.

각 클릭 동작에 대해 실제로 클릭 리스너의 인스턴스를 1 개 사용하고 뷰의 상위 태그를 확인하기 만하면됩니다. 예를 들어 레이아웃의 모든 삭제 버튼에 대해 View.OnClickListener의 인스턴스를 1 개 만듭니다. onClick() 메서드에서 상위 뷰의 태그를 확인하고 삭제해야 할 Item 인스턴스를 가져옵니다.

private class ItemListAdapter extends ArrayAdapter<Item> 
{ 

    View.OnClickListener deleteListener = new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 
      View parent = (View)view.getParent(); 
      Item item = (Item)parent.getTag(); 
      //Do something with "item" 
     } 
    }; 

    //Remainder omitted 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 

     //Remainder omitted 
     row.setTag(currentItem); 
     View deleteButton; //find this somewhere in your layout 
     deleteButton.setOnClickListener(deleteListener); 

     return row; 
    } 

} 
관련 문제