代码之家  ›  专栏  ›  技术社区  ›  Dariusz Bacinski

如何避免在getView()中设置inline onClickListner

  •  2
  • Dariusz Bacinski  · 技术社区  · 14 年前

    我被要求重构 getView() 代码如下。

    我有自定义适配器的ListView。每一行都包含可单击的按钮和文本。

    目前onClickListeners设置在 ,这是一个非常疯狂的想法,因为这个方法被频繁调用。在每一个onClick函数中,我都需要访问私有数据来调用带有bundle的新活动。

    如何将onClick定义移到getView()例程之外?

    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;
    }
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Pentium10    14 年前

    您的活动必须实现OnClickListener,并将实现的方法上移到活动级别。

    view 可以检测事件来自哪个UI对象的方法的参数(按钮,textview)。

    tag getView 方法,您将通过 getTag

        2
  •  1
  •   Yar    13 年前

    恐怕Pentium10的答案不正确。如果复选框是独立于列表项本身的可单击和可检查的(假设它是在列表项xml布局中定义的),那么它将拦截click事件,并且列表项(列表的OnItemClickListener)将根本不接收单击。 因此,您必须在适配器本身中实现onClickListener—在getView()中,或者让适配器实现onClickListener—在这种情况下,必须对项进行标记,以便侦听器知道它在操作哪个项。