【问题标题】:How to avoid setting inline onClickListner in getView()如何避免在 getView() 中设置内联 onClickListner
【发布时间】:2010-08-09 08:30:02
【问题描述】:

我被要求重构下面显示的 getView() 代码。

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

目前在getView()的body中设置了onClickListeners,这是很疯狂的想法,因为这个方法被调用的频率很高。在每个 onClick 函数中,我都需要访问私有数据才能使用 bundle 调用新活动。

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

当 onClick 将被调用时,我需要有关列表元素位置的信息(访问私有数据)以及单击了哪个视图(以启动正确的 Activity)。

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;
}

【问题讨论】:

  • getContext() 在哪里?我正在研究类似的列表视图

标签: android listview onclick listener


【解决方案1】:

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

根据方法的view 参数,您可以检测事件来自哪个UI 对象(按钮、文本视图)。

关于如何检测列表视图中的哪条记录/行。您必须在getView 方法中的按钮和文本视图上设置自定义tag,如果字符串不够,您将在事件中通过getTag 读取此标签也可以是自定义对象。可能/推荐的方式是在适配器中的位置。

【讨论】:

  • 我就是这么想的。不幸的是,我使用setTag 作为慢速适配器。我将重建我的代码并尝试一下。
【解决方案2】:

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

【讨论】:

  • 是的,您必须在您希望接收回调的每个视图(行内布局)上设置 onClickListener。
猜你喜欢
  • 2013-04-20
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多