2

사용자 지정 ListViewAdapter를 사용하여 목록을 표시하고 있습니다. 목록의 각 행에는 3 개의 버튼, 즉 연결된 리스너가 있습니다. 그러나 각 스크롤 중에 convertView가 존재하는 행에 대해서도 null이 아닌 값으로 새로운 OnClickListeners가 작성되는 것이 매우 불안합니다. 작성하고 멀리 던지는 것 같다 -ListViewAdapter -보기에 연결된 청취자가 수집되는 경우?

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.listview_item, parent, false); 
    } else { 
     view = convertView; 
    } 
    final TextView textView = (TextView) view.findViewById(R.id.txtProduct); 
    textView.setText(name); 
    textView.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      ... 
     } 
}); 
... two more listeners, with the same approach 
return view; 

자바, 스파이더 의미 "팅-A-lings"내 경험에 따라 : 내가 이해

// 가장 일반적인 방법은보기를 변환하는 동일한 청취자 접근법은 가비지 수집가 학대입니다. 오래된 청취자가 언제 수집되었는지 확신 할 수 없습니다 ...

새 청취자를 사용하는 대신 기존 청취자를 사용할 방법이 있습니까? (어떤 종류의 캐시 데이터 구조)

답변

1

목록 어댑터 클래스를 View.OnClickListener 인터페이스에서 상속하도록 설정할 수 있습니다. 그런 다음 간단히 설정하십시오

textView.setOnClickListener(this); 

그리고 어댑터 클래스 'onClick 방법으로 클릭을 처리하십시오. 당신이이 태그를 얻어서 처리하는 목록에서 어떤 위치를 알 수 onClick에, 그리고

textView.setTag(position); 

: 알고, 예를 들어, 클릭하는 행 위 일하기 전에이 줄을 추가

public void onClick(View v) { 
    Object item = myList.get((Integer) v.getTag()); 
    //handle click event 
} 
+0

따라서 행은 클릭 가능한 리스너가되며 convertView도 리스너를 재사용합니다. 아름답고 우아한 솔루션 :) 하지만, 내가 찾고있는 것은 3 개의 리스너가있는 행입니다. 각기 다르게 동작하므로 onClick 구현은 문제를 해결하지 못합니다. – firluk

관련 문제