Как открыть фрагмент из RecyclerView Adapter? - PullRequest
0 голосов
/ 20 января 2019

Я хотел бы передать данные из адаптера в мой фрагмент, поэтому, в основном, когда я пытаюсь щелкнуть элемент, фрагмент должен открыться, но мое приложение ничего не сделало.так как я могу решить эту проблему?

Адаптер



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);
    }

}

Я уже изменил свою активность перед публикацией, чтобы она больше меняла onRecycleViewOnItemClickListener

MainActivity



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>    

iя уже попробовал решения из комментария ниже, и мой фрагмент все еще не обнаруживается.Я не получил никакой ошибки от моего logCat, когда я пытаюсь нажать.

Ответы [ 3 ]

0 голосов
/ 20 января 2019

попробуйте ниже код для фрагмента вызова из адаптера. в этом коде у меня есть фрагмент вызова из адаптера 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()

этот код работает для меня.

0 голосов
/ 20 января 2019

Ваш интерфейс / слушатель не инициализирован, он нулевой.

Вы должны реализовать метод click из своей деятельности, в котором вы инициализировали свой адаптер и установить значение для слушателя "listenerThis".

Создайте установщик для слушателя в вашем адаптере:

  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 голосов
/ 20 января 2019

Сделайте два небольших изменения в вашем коде-

Адаптер

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

MainActivity

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

вот и все. Надеюсь, это будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...