Как передать прослушиватель в адаптереviewler, который находится в OnSuccessListener - PullRequest
0 голосов
/ 14 января 2019

Надеюсь, мой вопрос имеет смысл: по сути, у меня есть фрагмент рециркулятора внутри фрагмента, который я хочу открыть другим фрагментом с помощью Onclick. Поскольку его фрагмент к фрагменту, я использую интерфейс / слушатель в моем адаптере просмотра повторного просмотра. Однако мне нужно передать что-то в моем адаптере recyclerView. Проблема в том, что адаптер находится в OnCreateView, который находится в OnSuccessListener, так как я получаю местоположение для моего приложения. Поэтому я не знаю, как передать что-либо кроме null для моего слушателя в моем адаптере. Мне нужно передать слушателя в моем адаптере. Я надеюсь, что это имеет смысл, но вот мой код, чтобы он был понятен:

RecyclerViewAdapter

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

private List<MessierData> MessierDataList;
   Context mContext;

private MessierListener messierListener;

public interface MessierListener{
    void onClicked(Bundle bundle);
}





 class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    public TextView currentLocation;

    public ViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);

        currentLocation = (TextView) itemView.findViewById(R.id.messier_location);


    }

    @Override
    public void onClick(View view) {
        if (messierListener !=null) {
            int col = getAdapterPosition();
            Bundle bundle = new Bundle();
            bundle.putDouble("RightAscension", MessierDataList.get(col).getMessierRA());
            bundle.putDouble("Declination", MessierDataList.get(col).getMessierDEC());
            bundle.putDouble("Azimuth", MessierDataList.get(col).getMessierAZ());
            bundle.putDouble("Altitude", MessierDataList.get(col).getMessierALT());
            messierListener.onClicked(bundle);



        }

        }

    }


public MessierRecyclerViewAdapter(List<MessierData> MessierDataList, Context mContext, MessierListener messierListener){
    this.MessierDataList = MessierDataList;
    this.mContext = mContext;
    this.messierListener = messierListener;
}

@Override
public MessierRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.messier_recycler_item,parent, false);



    return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder( MessierRecyclerViewAdapter.ViewHolder holder, int position) {
    holder.currentLocation.setText(MessierDataList.get(position).getMessierLocation());


}

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


}

Фрагмент, содержащий представление Recycler (фрагмент Messier) В нем много кода, поэтому я просто добавлю onCreateView, который сейчас является проблемой:

public class MessierFragment extends Fragment implements     
MessierRecyclerViewAdapter.MessierListener {
...
   @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_messier, container, false);

    mRecyclerView = (RecyclerView)view.findViewById(R.id.messier_recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerView.addItemDecoration(new DividerItemDecoration(mRecyclerView.getContext(),DividerItemDecoration.VERTICAL));



    mFusedLocationClient.getLastLocation().addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {

            if (location != null) {
                latitude = location.getLatitude();
                longitude = location.getLongitude();

                Sun sunInstance = new Sun();
                sunInstance.SunmCalculation(longitude, latitude);

                Andromeda andromedaexample = new Andromeda();
                andromedaexample.AndromedaCalculation(latitude);


                messierList();
                messierItems.addAll(messierList());

                adapter = new MessierRecyclerViewAdapter(messierItems, mRecyclerView.getContext(),MessierFragment.this);
                mRecyclerView.setAdapter(adapter);


            }

        }
    });

    return view;
}

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь передать что-то для слушателя Messier в адаптере, появляется предупреждение от Android Studio, поэтому я не уверен, как решить проблему. Прямо сейчас у меня есть MessierFragment.this, который не работает. Спасибо за вашу помощь.

РЕДАКТИРОВАНИЕ / ПРЕДУПРЕЖДЕНИЕ Android-студия предоставляет

Ожидаемый параметр в адаптере: MessierListener

Если я использую «this» в адаптере в onCreateView: this (anonymous ... android.location.Location>)

Надеюсь, это несколько прояснит проблему.

Ответы [ 2 ]

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

Я все выяснил, или, по крайней мере, почему этот код правильный. На основании того, что я обнаружил, вы должны ссылаться на слушателя, который реализует фрагмент хоста. Именно поэтому в нормальных ситуациях один из них вставлял «это» в мой адаптер, чтобы передать этого слушателя в программу повторного просмотра. Однако, поскольку мой адаптер находится в OnSuccessListener, «this» ссылается на тот прослушиватель, который создает ошибку. Чтобы обойти это, я поместил в MessierFragment.this, который ссылается на слушателя, который реализует фрагмент хоста.

 mFusedLocationClient.getLastLocation().addOnSuccessListener(getActivity(), new      
 OnSuccessListener<Location>() {
    @Override
    public void onSuccess(Location location) {

        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();

            Sun sunInstance = new Sun();
            sunInstance.SunmCalculation(longitude, latitude);

            Andromeda andromedaexample = new Andromeda();
            andromedaexample.AndromedaCalculation(latitude);


            messierList();
            messierItems.addAll(messierList());

            adapter = new MessierRecyclerViewAdapter(messierItems, mRecyclerView.getContext(),MessierFragment.this);
            mRecyclerView.setAdapter(adapter);
0 голосов
/ 14 января 2019

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

если это правильно, вы можете использовать библиотеку EventBus, я думаю, это поможет вам во многих ситуациях

https://github.com/greenrobot/EventBus, http://greenrobot.org/eventbus/

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