当前位置: 首页 > 知识库问答 >
问题:

将单击侦听器附加到回收器视图项的每个组件[重复]

袁帅
2023-03-14

我正在学习Android开发。24小时以来一直在纠结这个问题,需要帮助。

在我的每个回收视图项上,我有两个视图ePaper和Amp;网站。我想在整个项目上附加不同的点击侦听器,ePaper视图和网站视图

在上图中,我需要放3点击监听器1。点击红色块1-做X(意图到另一个活动)2。点击红色块2-做Y(意图到另一个活动)3。点击绿色块,整个项目视图-do Z(对话框)

尝试了很多解决方案。但是,当我点击红色块时,除了红色块中的监听器之外,绿色块中的监听器也开始动作。

在主要活动中

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(),
            recyclerView, new ClickListener() {
        String userid = Utils.getUserId(getApplicationContext());
        @Override
        public void onClick(View view, final int position) {
            // Set listeners here for complete card view
            final NewsPapersDataModel currentPaper = newsPapersList.get(position);
            Log.d("TAG","Clicked 1");

                newsSelectionDialog(currentPaper.getEpaper(),currentPaper.getWebsite());
        }
        @Override
        public void onLongClick(View view, int position) {
            Toast.makeText(MainActivity.this, "Long press on position :" + position, Toast.LENGTH_LONG).show();
        }
    }));

在报纸适配器中

    public void onBindViewHolder(@NonNull final CustomViewHolder holder, int position) {
    //  Log.d("TAG","Holder is "+newsList);

    final NewsPapersDataModel currentItem = newsList.get(position);
    final String ePaperUrl = currentItem.getEpaper();
    final String webSiteUrl = currentItem.getWebsite();
    final String paperName = currentItem.getName();

    holder.paperNameView.setText(newsList.get(position).getName());

    if (TextUtils.isEmpty(currentItem.getEpaper())) {
        //  Log.d("TAGG","ePaper - "+currentItem.getEpaper()+" Website - "+currentItem.getWebsite());
        holder.ePaperView.setVisibility(View.GONE);

    } else if (TextUtils.isEmpty(currentItem.getWebsite())) {
        holder.websiteView.setVisibility(View.GONE);

    }

    holder.ePaperView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            saveLinksToDb(userid, "ePaper", ePaperUrl);
            Intent intent = new Intent(context, NewsAdvancedWebViewActivity.class);
            intent.putExtra("url", ePaperUrl);
            context.startActivity(intent);

        }
    });

    holder.websiteView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            saveLinksToDb(userid, "Website", webSiteUrl);
            Intent intent = new Intent(context, NewsAdvancedWebViewActivity.class);
            intent.putExtra("url", webSiteUrl);
            intent.putExtra("paperName",paperName);
            context.startActivity(intent);

        }
    });

}

请帮帮我。

共有3个答案

莫英喆
2023-03-14

中尝试将适配器的父布局,如下所示

holder.parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

         final NewsPapersDataModel currentPaper = newsPapersList.get(position);
            Log.d("TAG","Clicked 1");

                newsSelectionDialog(currentPaper.getEpaper(),currentPaper.getWebsite());
        }
    });

这里的 是您的适配器项布局根视图,类似于

潘衡
2023-03-14

您需要在适配器中为click侦听器创建一个接口,并为所需的每个项添加onclick方法。

请查看下面的代码。

在适配器中,创建接口

public interface OnClickListener {
    void onPaperViewClick(View view, int position);
    void onWebsiteViewClick(View view, int position);
}

和创建方法来设置从活动中单击侦听器

public void setOnClickListener(OnClickListener listener) {
    this.onClickListener= listener;
}

在onBindViewHolder方法中,

holder.ePaperView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {

        onClickListener.onPaperViewClick(view, position);
});

holder.websiteView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {

        onClickListener.onWebsiteViewClick(view, position);
});

最后,在你的活动中,设置

recyclerViewAdapter.setOnClickListener(new NewsPaperAdapter.OnClickListener(){
    @override
    void onPaperViewClick(View view, int position){
         // code to handle paper click
    }

    @override
    void onPaperViewClick(View view, int position){
        // code to handle website click
    }
};
施自珍
2023-03-14

从MainActivity中删除 ,并在适配器中添加

onBindViewHolder(){
    //rest of your code

    holder.itemView.setOnClickListener(new OnClickListener{
        @Override
        public void onClick(View view) {
           // Click implementation here
        }
        @Override
        public void onLongClick(View view) {
           // Long click implementation here
        }

    })
}

:

public class CustomViewHolder extends RecyclerView.ViewHolder{
    // Other fields

    View itemView;
    public CustomViewHolder(View view){
    // rest of initialization

    itemView = view;
    }
}

编辑(OP希望处理活动内部的应用程序逻辑)

创建名为 的接口类:

public interface RecyclerViewActionListener {
    void onViewClicked(int clickedViewId, int clickedItemPosition);
    void onViewLongClicked(int clickedViewId, int clickedItemPosition);
}

然后修改 ,使其在构造函数中有一个附加字段。我们将在创建适配器时将listener从Activity传递到此adpater:

public class RecyclerViewAdpater extends RecyclerView.Adapter<RecyclerViewAdpater.CustomViewHolder>{

    private RecyclerViewActionListener mListener;

    public RecyclerViewAdpater(ArrayList<Object> yourData,RecyclerViewActionListener mListener) {
        this.mListener = mListener;
    }

    @NonNull
    @Override
    public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false );
        final CustomViewHolder holder = new CustomViewHolder(view);

        holder.webView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.onViewClicked(view.getId(), holder.getAdapterPosition());
            }
        });
        holder.paperView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.onViewClicked(view.getId(), holder.getAdapterPosition());
            }
        });
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.onViewClicked(view.getId(), holder.getAdapterPosition());
            }
        });
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                mListener.onViewLongClicked(view.getId(), holder.getAdapterPosition());
                return false;
            }
        });
        return holder;
    }

    public class CustomViewHolder extends RecyclerView.ViewHolder{
        // Other fields

        View itemView;
        View webView;
        View paperView;
        public CustomViewHolder(View view){
            super(view);
            // rest of initialization

            itemView = view;
        }
    }
}

然后在活动中实现 并覆盖 中的方法:

public class MainActivity extends AppCompatActivity implements RecyclerViewActionListener {


    RecyclerViewAdpater adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        // Skipped for the sake of brevity
        // Pass your listener to adapter here
        adapter = new RecyclerViewAdpater(yourData, this );
    }

    @Override
    public void onViewClicked(int clickedViewId, int clickedItemPosition) {
        switch (clickedItemPosition){
            case R.id.web_view:
                // Application logic when webview clicked
                break;
            case R.id.paper_view:
                // Application logic when paperview clicked
                break;
            case R.id.recyclerview_item:
                // Application logic when whole item clicked
                break;
        }
    }

    @Override
    public void onViewLongClicked(int clickedViewId, int clickedItemPosition) {
        switch (clickedViewId){
            case R.id.recyclerview_item:
                // Application logic when whole item long-clicked
                break;
        }
    }
}

在xml文件中,不要忘记为视图分配ID。因为我们正在用他们的ID检测被点击的视图。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recyclerview_item"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/web_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"/>

    <ImageView
        android:id="@+id/paper_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>
 类似资料:
  • 我有一个有2个元素的回收器视图。我想添加2个按钮来做不同的事情(取决于回收器视图的哪个元素。怎么可能做到这一点?我的元素是文本视图 设置ctiv.kt 我的适配器。kt

  • 如果用户点击一个,我希望它做一些事情,也为两个和三个。我如何实现这一点?

  • 然后,在每个@test方法中,我调用activitytestrule.launchactivity(Intent.action_main)),然后进行单击。我发现,只有第一次点击不起作用,但第二次和第三次点击起作用。那么,这种行为的原因又能是什么呢?

  • 如何在回收者视图中收听触摸事件?我已经为视图持有者实现了click listener,但它可以在整个视图上工作。我在每个视图支架中都有一个图像视图,当用户单击图像视图时,我需要执行一个操作。 当前视图持有者代码。

  • 问题内容: 我有一个带有许多按钮的程序,所有这些按钮都将执行相同的功能。我想知道是否有一种方法可以将单个侦听器附加到程序中所有现有的JButton。 问题答案: 就像是: 该会从事件使其知道哪个按钮被点击获取源对象。 如果您需要在Action中使用if / else逻辑,那么您应该创建一个单独的Action。如果代码不属于某个动作,请勿将其强制执行。

  • 我有一个有许多按钮的程序,所有这些按钮都将执行相同的功能。我想知道是否有办法将一个侦听器附加到程序中所有现有的JButton。

  • 问题内容: 我正在构建一个允许将本地文件拖放到div上的组件。然后是有关已删除文件的信息输出。 我的问题是我不知道如何正确地附加事件侦听器以及创建组件时。 我的App组件是我所有逻辑所在的地方(拖放和拖移的处理程序),我创建了一个单独的组件,该文件将被放置在该组件上-dropZone组件。 我尝试将事件侦听器放在App组件的dropZone标记上,如果放置了dropZone组件,则在该位置放置事件

  • 是否有办法将AWT侦听器添加到SWT组件? 我以前制作了一个主要在AWT和Swing组件中运行的应用程序。现在,我有热键功能,它依赖于一个定制的库,该库监听全局键事件并返回相应的AWT键代码。 当我改变整个应用程序并使用SWT组件时,我的问题就出现了。正如我们所知,一些键现在返回一个不同的键代码,这扰乱了整个热键功能。 我想到的最初解决方案是: A.使用javax。摆动jtextfield作为my