如何从RecyclerView Adapter打开片段?

问题描述 投票:-1回答:3

我想将数据从适配器传递给我的片段,所以基本上当我尝试点击一个项目时,片段应该打开,但是,我的应用程序什么也没做。那怎么能解决这个问题呢?

适配器



public class CatAdapter extends RecyclerView.Adapter<CatAdapter.ViewHolder> {

    private static String TAG = "Cat Adapter";

    private ArrayList<String> catUrlImage = new ArrayList<>();
    private ArrayList<String> cuteCatName = new ArrayList<>();
    private Context catContext;
    private FragmentManager fragmentManager;
    private OnRecyclerViewItemClickListener listenerthis;


    public CatAdapter(ArrayList<String> catUrlImage, ArrayList<String> cuteCatName, Context catContext, OnRecyclerViewItemClickListener listener) {
        this.catUrlImage = catUrlImage;
        this.cuteCatName = cuteCatName;
        this.catContext = catContext;
        this.listenerthis = listener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_item, viewGroup, false);
        ViewHolder catViewHolder = new ViewHolder(v);


        return catViewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
        Log.d(TAG, "OnBinding: called");

        Glide.with(catContext)
                .asBitmap()
                .load(catUrlImage.get(position))
                .into(viewHolder.catImage);

        viewHolder.catName.setText(cuteCatName.get(position));

        viewHolder.catItemLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(catContext, cuteCatName.get(position), Toast.LENGTH_SHORT).show();
                listenerthis.onClick(position);
            }
        });
    }

    @Override
    public int getItemCount() {
        return catUrlImage.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        CircleImageView catImage;
        TextView catName;
        RelativeLayout catItemLayout;


        public ViewHolder(View itemView) {
            super(itemView);

            catImage = itemView.findViewById(R.id.iLikeCat);
            catName = itemView.findViewById(R.id.catVeryCuteName);
            catItemLayout = itemView.findViewById(R.id.cat_container);

        }
    }

    public interface OnRecyclerViewItemClickListener{
        void onClick(int parameter);
    }

}

我已经在帖子之前更改了我的Activity,因此它更改了onRecycleViewOnItemClickListener

我的知识



public class MainActivity extends BaseActivity implements CatAdapter.OnRecyclerViewItemClickListener{
    private static final String TAG = "MainActivity";

    private ArrayList<String> catArray = new ArrayList<>();
    private ArrayList<String> catArrayImageUrl = new ArrayList<>();
    DataCat dataCat = new DataCat();

    private RecyclerView recyclerView;
    private RecyclerView.Adapter rAdapter;
    private RecyclerView.LayoutManager rLayoutManager;
    GalleryFragment galleryFragment = new GalleryFragment();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "Cat Has Create OnCreated");
        findView();
        initView();
        catData();
    }

    private void catData() {
        Log.d(TAG, "Preparing A Bitmap for a Cat");
        for (int i = 0; i < dataCat.catUrl.length; i++) {
           catArrayImageUrl.add(dataCat.catUrl[i]);
           catArray.add(dataCat.catName[i]);
        }

        initRecycleView();

    }

    private void initRecycleView() {
        CatAdapter catAdapter = new CatAdapter(catArrayImageUrl, catArray, this, this);
        recyclerView.setAdapter(catAdapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }

    @Override
    public void findView() {
        Log.d(TAG, "initRecylce Vieq");
        recyclerView = findViewById(R.id.recyclerViewList);
        rLayoutManager = new LinearLayoutManager(this);

    }

    @Override
    public void initView() {

    }

    @Override
    public void initListener() {
        recyclerView.setHasFixedSize(true);
    }

    @Override
    public void onClick(int parameter) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container_galery, galleryFragment)
                    .addToBackStack(null)
                    .commit();
    }
}

我输入一些布局可能在我的布局上有一些不好的结构

activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.MainActivity">


<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerViewList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" />

<FrameLayout
    android:id="@+id/container_galery"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>    

我已经尝试了下面评论的解决方案,我的片段仍然没有出现。当我尝试点击时,我的logCat没有收到任何错误。

android fragment adapter
3个回答
0
投票

在您的代码中做两处小改动 -

适配器

public CatAdapter(ArrayList<String> catUrlImage, ArrayList<String> cuteCatName, Context catContext, OnRecyclerViewItemClickListener listenerthis) {
    this.catUrlImage = catUrlImage;
    this.cuteCatName = cuteCatName;
    this.catContext = catContext;
    this.listenerthis = listenerthis;
}

我的知识

private void initRecycleView() {
    CatAdapter catAdapter = new CatAdapter(catArrayImageUrl, catArray, this, this);
    recyclerView.setAdapter(catAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
}

而已。希望它会有所帮助。


1
投票

您的接口/侦听器未初始化,它为null。

您必须在初始化适配器的活动中实现click方法,并将值设置为监听器“listenerThis”。

在适配器中为侦听器创建一个setter:

  public void setOnRecyclerViewItemClickListener(OnRecyclerViewItemClickListener listener){
        listenerthis=listener;
    }

并在您的活动中实现监听器:

 adapter.setOnRecyclerViewItemClickListener(new OnRecyclerViewItemClickListener(int parameter){

@override OnClick(int Parameter){
//do whatever you want with that parameter.

})

0
投票

尝试从适配器调用片段的代码。在这段代码中,我有来自recylerview适配器的调用片段。

myholder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    FragmentManager manager=((AppCompatActivity)context).getSupportFragmentManager();
    FragmentTransaction Ft=manager.beginTransaction();
    Ft.replace(R.id.container_fl,new ProfileFragment());

    Ft.commit();
}

});

请检查你的片段支持android.support.v7.app.AppCompatActivity

试试这个:

((AppCompatActivity)activity).getSupportFragmentManager()

和支持:support.v4.app.FragmentManager试试这个:

FragmentManager manager = ((Activity)context).getFragmentManager();

要么

((AppCompatActivity)activity).getSupportFragmentManager()

这段代码对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.