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

标签 android listview onclick listener

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

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

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

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

最佳答案

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

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

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

关于android - 如何避免在 getView() 中设置内联 onClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3438408/

相关文章:

android - FFMpeg(Android) av_read_frame 或 avcodec_decode_video2 返回相同的颜色

Android - ListFragment OnClickListener 不工作

android - autoLink 与 onClick 事件

javascript - 如何检查单击的 div 的至少一侧(左侧或右侧)是否没有其他 div

java - 使用应用程序图标作为向上按钮从 ActionBarActivity 返回 Fragment?

Android 相机和照片选择器 Intent

android - 如何在Android编程中离线发音英语单词?

android - FLutter中可滚动列中的4个水平Listview

java - 如何设置对话框内文本的点击方法

jquery - 使用 'onclick' 后如何重新启用 jQuery 选项卡?