Передать строку из адаптера во фрагмент, используя интерфейс - PullRequest
0 голосов
/ 24 января 2019

Этот вопрос основан на этом ответе.

Я пытаюсь передать строку из моего RecyclerView.Adapter во фрагмент.

В моем адаптереЯ добавил следующее:

onItemClickListner onItemClickListner;

public void setOnItemClickListner(VideoAdapter.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner{
    void onClick(String str);//pass your object types.
}

Я передаю следующую строку, когда количество элементов в моем адаптере меньше единицы (адаптер пуст):

onItemClickListner.onClick("TESTING");

Затем в моемфрагмент я добавляю следующее:

//I do the following after setting my adapter
videoAdapter.setOnItemClickListner(new VideoAdapter.onItemClickListner() {
        @Override
        public void onClick(String str) {
            Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
        }
    });

По какой-то причине строка пуста / пуста, и сбой указывает на onItemClickListner.onClick("TESTING");.

Может кто-нибудь, пожалуйста, посмотрите и посмотрите, что я могуделать неправильно?


Редактировать:

Я звоню onItemClickListner.onClick("TESTING"); внутри моего OnMenuItemClickListener, как показано ниже:

popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {

                case R.id.delete:

                    onItemClickListner.onClick("TESTING");

                return true;

}

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

Ответы [ 3 ]

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

Вот часть моего рабочего примера RecyclerView.Adapter

@Override
    public void onBindViewHolder(ViewHolder holder, final int position) {

        final PopupMenu popupMenu = new PopupMenu(context, holder.itemView);
        popupMenu.inflate(R.menu.simple_menu);
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.item1:
                        if (onEmptyListListener != null) {
                            onEmptyListListener.onEmpty("example string");
                        }
                        return true;
                    default:
                        return false;
                }
            }
        });
        final String name = values.get(position);
        holder.txtHeader.setText(name);
        holder.txtFooter.setText("Footer: " + name);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupMenu.show();
            }
        });
    }

Остальная часть кода похожа на вашу, тосты отображаются правильно.

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

Во-первых, спасибо за все ответы и комментарии.

Я исправил эту проблему, выполнив следующие действия.


В своем Adapter я добавил следующее:

private UpdateInterface listner;

public interface UpdateInterface {
    void recyclerviewOnUpdate(int amount);
}

public VideoAdapter(Context context, ArrayList<PathModel> thumbPathList, ArrayList<PathModel> videoPathList, UpdateInterface listner) {
    this.context = context;
    this.thumbPathList = thumbPathList;
    this.videoPathList = videoPathList;
    //I added this
    this.listner=listner;
}

Я вызываю интерфейс так же, как и в своем вопросе:

//Passing the amount of items in adapter
listner.recyclerviewOnUpdate(getItemCount());

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

public class VideoFragment extends Fragment implements VideoAdapter.UpdateInterface

и теперь у меня есть метод для работы, показанный ниже:

@Override
public void recyclerviewOnUpdate(int amount) {
    //Now I can get the int and check if the adapter is empty after removing a item
    if (amount<1) {
        txtEmptyAdapter.setVisibility(View.VISIBLE);
    }
}
0 голосов
/ 24 января 2019

Вы это заметили?из вашей справки url

onItemClickListner your_interface;

public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
    this.your_interface= onItemClickListner;
}

this.onItemClickListner = onItemClickListner это будет само назначение.что может быть причиной проблемы.

здесь your_interface инициализируется.Я подозреваю, что ваш onItemClickListner не инициализирован.

Поэтому попробуйте изменить имя

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