如何避免在getView()中设置内联onClickListener

时间:2010-08-09 08:30:02

标签: android listview onclick listener

我被要求重构下面提到的getView()代码。

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

目前onClickListeners设置在getView()的主体中,这是非常疯狂的想法,因为这种方法被非常频繁地调用。在每个onClick函数内部,我需要访问私有数据以使用bundle调用新活动。

如何在getView()例程之外移动onClick定义?

当调用onClick时,我需要有关列表元素位置的信息(访问私有数据)以及单击了哪个View(以启动正确的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;
}

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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