单击 recyclerView 项目时未打开新片段

Posted

技术标签:

【中文标题】单击 recyclerView 项目时未打开新片段【英文标题】:new Fragment is not opening when recyclerView item is clicked 【发布时间】:2021-04-11 01:35:05 【问题描述】:

我一直试图在点击时启动一个新片段,我在互联网上发现这是这样的,点击时方法被激怒但没有任何反应

public class PlacesRecyclerAdapter extends  
RecyclerView.Adapter<PlacesRecyclerAdapter.ViewHolder> implements View.OnClickListener
//some code

@Override
public void onClick(View v) 
AppCompatActivity activity = (AppCompatActivity)  context;
TextView t = v.findViewById(R.id.placeName);
fragment = new DetailFragment(getCurrentPlace((String) t.getText()));
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.tabItem, fragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
transaction.commit();



//some code
 

对于 getCurrentPLace(),它是一个返回 Place 对象的方法,我用调试器检查过它,它按预期工作

这里是 DetailFragment.class 代码

public class DetailFragment extends Fragment 

private MainActivity.Place place;
TextView name;

public DetailFragment(MainActivity.Place place) 
this.place = place;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable 
                      Bundle savedInstanceState) 
View view = inflater.inflate(R.layout.detail_place_fragment, container, false);

name.setText(place.getTitle());

return view;


这里是 ID 为 R.id.tabItem 的 XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/tabItem"
android:layout_
android:layout_>

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/placesRecycleView"
    android:layout_
    android:layout_ />

</androidx.constraintlayout.widget.ConstraintLayout>

PS:我尝试了类似问题的解决方案,但没有任何效果。

【问题讨论】:

我强烈建议您使用导航组件,然后您只需使用一行命令即可轻松导航。 您是否将setOnClickListener(this) 设置为回收站视图项? @grabarz121 我应该把它放在哪里。 @NasreddineBouchemel 在onBindViewHolder()方法里面,应该是holder.itemView.setOnClickListener(this) @grabarz121 我做到了,onClick 方法被激怒了,但没有任何反应:/ 【参考方案1】:

一开始最好的方法是使用接口。

Interface onClick
    void click();

并在类的构造函数中实现它:

class PlacesRecyclerAdapter(onClick click)...

并像使用它

t.setOnClickListener
  click.click();

当您在活动中定义适配器时,此方法(单击)实现,您可以在活动中定义它而不是适配器

fragment = new DetailFragment(getCurrentPlace((String) t.getText()));
FragmentTransaction transaction =    activity.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.tabItem, fragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
transaction.commit();

但避免这些问题的最佳方法是使用导航组件。

【讨论】:

我应该把t.setOnClickListener放在哪里 RecyclerView with ViewHolder 按照这个链接你必须在 viewHolder 类中声明一个方法并将该代码放在那里并在 onBindViewHolder 中调用它,如果你想将数据传递给你的片段接口的方法必须有输入像这样 -> void click(String name);

以上是关于单击 recyclerView 项目时未打开新片段的主要内容,如果未能解决你的问题,请参考以下文章

从片段中获取意图值后,我如何在 recyclerview 项目中实现单击

如何通过单击 recyclerview 中的项目来打开新活动 [重复]

如何在 Recyclerview Item Click 上打开新片段?

Android - 在 RecyclerView 中单击的项目上打开新活动 [重复]

如何在单击 RecyclerView 项目时从一个片段移动到另一个片段

如何在片段中的 recyclerView 上打开不同的活动?