2010-08-09 2 views
2

아래와 같이 getView() 코드를 리팩터링하도록 요청 받았습니다.getView()에서 onClick onClickListner 설정을 피하는 방법

사용자 지정 어댑터가있는 ListView가 있습니다. 모든 행에는 클릭 가능한 버튼과 텍스트가 있습니다.

getView() 본문에 onClickListeners가 설정되어있는 지금이 메서드는 매우 자주 호출되기 때문에 이것은 매우 이상한 생각입니다. 모든 onClick 함수 내부에서 번들로 새 활동을 호출하기 위해 개인 데이터에 액세스해야합니다.

어떻게 getView() 루틴 외부에서 onClick 정의를 이동할 수 있습니까?

onClick을 호출 할 때 목록 요소의 위치 (개인 데이터에 액세스하기 위해)와 클릭 한 뷰 (정확한 활동 시작)에 대한 정보가 필요합니다.

public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertview == null) { 
     convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.photo_tweet_row, null); 
    } 

    TextView userTweet = (TextView) v.findViewById(R.id.feed_user_tweet_body); 
    RepliesButton repliesBtn = (RepliesButton) v.findViewById(R.id.feed_replies_button); 

    Status twitterDataItem = getItem(position); 

    if (twitterDataItem != null) { 

     if (userTweet != null) { 
      userTweet.setText(twitterDataItem.getText()); 
     } 
     if (repliesBtn != null) { 
      repliesBtn.setText(" replies"); 
     } 

     userTweet.setOnClickListener(new View.OnClickListener() {   
      @Override 
      public void onClick(View v) {      
       Intent intent = new Intent(getContext(), ProfileActivity.class); 
       intent.putExtra(getContext().getString(R.string.serializable_user), twitterDataItem.getUser()); 
       getContext().startActivity(intent); 
      } 
     }); 

     repliesBtn.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View view) { 
       if (!twitterDataItem.getComments().contentEquals("0")) { 
        Intent myIntent = new Intent(getContext(), RepliesToFeedActivity.class); 
        myIntent.putExtra("photoTweet", twitterDataItem); 
        getContext().startActivity(myIntent); 
       } 
      } 
     }); 
    } 
    return convertView; 
} 
+0

여기서 getContext()는 무엇입니까? 나는 비슷한 목록보기에서 일하고있다. –

답변

3

귀하의 activitiy은 OnClickListener를 구현하고 구현 된 메소드를 활동 레벨까지 이동해야합니다.

메서드의 view 매개 변수에 따라 이벤트가 발생한 UI 개체 (button, textview)를 감지 할 수 있습니다.

목록보기에서 어떤 레코드/행을 감지하는 방법은. 사용자는 을 getView 메서드의 버튼 및 textviews에 설정해야합니다. getTag을 통해 이벤트에서 읽습니다.이 태그는 문자열이 충분하지 않은 경우 사용자 정의 객체 일 수 있습니다. 아마/권장 방법은 어댑터의 위치가되는 것입니다.

+0

그것이 내가 생각한 것이다. 불행히도 느린 어댑터에'setTag'를 사용하고 있습니다. 나는 내 코드를 재건하고 그것을 시도 할 것이다. –

1

나는 Pentium10 대답이 정확하지 않을까 걱정됩니다. 확인란이 목록 항목 xml 레이아웃에서 정의 된 것처럼 목록 항목 자체와 독립적으로 클릭 가능하고 검사 가능하면 클릭 이벤트를 가로 채고 목록 항목 (목록의 OnItemClickListener)은 클릭하십시오. 따라서 어댑터 자체에 onClickListener를 구현해야합니다 (getView()에서 사용하거나 어댑터에서 onClickListener를 구현하도록해야 함).이 경우 리스너가 태그를 지정해야 항목에서 해당 항목을 알 수 있습니다.

+0

예, 콜백을 받으려는 모든 뷰 (행 레이아웃 내부)에서 onClickListener를 설정해야합니다. –

관련 문제