RecyclerView - как отправить данные в MainActivity - PullRequest
0 голосов
/ 21 мая 2019

У меня есть адаптер RecyclerView для избранного пользователя.Представление реселлера заполняется во фрагменте диалогового окна.

public class FavoriteAdapter extends RecyclerView.Adapter<FavoriteViewHolder> implements ILatLong {

    private Context context;
    View view;
    MainActivity mainActivity;

    private List<Favorite> listFavorites;
    private SQLiteDB mDatabase;
    private int position;

    private ILatLong mCallback;

    public FavoriteAdapter(ILatLong mCallback){
        this.mCallback = mCallback;
    }

    public FavoriteAdapter(Context context, List<Favorite> listFavorites) {
        this.context = context;
        this.listFavorites = listFavorites;
        mDatabase = new SQLiteDB(context);
    }

    @Override
    public void onBindViewHolder(final FavoriteViewHolder holder, final int mPosition) {
        final Favorite singleFavorite = listFavorites.get(mPosition);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Clicked " + "'" + singleFavorite.getName() + "'", Toast.LENGTH_SHORT, true).show();
                //mainActivity.onLatLngData(singleFavorite.getLat(), singleFavorite.getLong());
                mCallback.onLatLngData(singleFavorite.getLat(), singleFavorite.getLong());
            }
        });

        //other stuff

    @Override
    public void onLatLngData(Double lat, Double lng) {
        try {
            mCallback = (ILatLong) context;
        }
        catch (ClassCastException e) {
            Log.d("MyDialog", "Activity doesn't implement the ILatLong interface");
        }
    }
}

Интерфейс:

public interface ILatLong {
    void onLatLngData(Double lat, Double lng);
}

Метод MainActivity:

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, ILatLong {
    @Override
    public void onLatLngData(Double lat, Double lng) {
        //use the values
    }
}

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

Когда я пытаюсь иотправить широту и долготу обратно в мой метод mainactivity, раскомментировав строку в onclick, я получаю «java.lang.NullPointerException: попытка вызвать виртуальный метод ... onLatLngData (java.lang.Double, java.lang.Double)» нассылка на нулевой объект ".

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

Редактировать : включил интерфейс обратного вызова

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Спасибо за помощь.Мне удалось решить эту проблему путем передачи моей MainActivity.

Проблема заключалась в том, что она идет MainActivty -> FavoriteDialog -> FavoriteAdapter, и я думаю, что меня здесь перепутали с цепочкой.Может быть, это поможет кому-то еще.

MainActivity:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener, ILatLong {

MainActivity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mActivity = this;
    }

    // Where I call my FavoriteDialog fragment, pass mActivity in constructor
    FragmentManager fm = getSupportFragmentManager();
    FavoriteDialog dialogFavorite = new DialogFavorite(context, mActivity);
    dialogFragment.show(fm, "FavoriteDialog");
}

DialogFavorite

DialogFavorite(Context context, MainActivity mActivity) {
        mainActivity = mActivity;
    }

// Adapter, pass mainActivity
FavoriteAdapter mAdapter = new FavoriteAdapter(context, allFavorites, mainActivity);
favoriteView.setAdapter(mAdapter);

FavoriteAdapter:

public FavoriteAdapter(Context context, List<Favorite> listFavorites, MainActivity mActivity) {
    this.context = context;
    this.listFavorites = listFavorites;
    mDatabase = new SQLiteDB(context);
    this.mainActivity = mActivity;
    }

Теперь вызывается mainActivity в моемFavoriteAdapter onclick работает:

@Override
public void onBindViewHolder(final FavoriteViewHolder holder, final int mPosition) {
    final Favorite singleFavorite = listFavorites.get(mPosition);

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mainActivity.onLatLngData(52.246218, 20.970564);
        }
    });
0 голосов
/ 21 мая 2019

Вы должны выполнить эти 4 шага, чтобы заставить работать обратный вызов

  1. Создать интерфейс, который содержит функцию обратного вызова
public interface MyCallback{
    public void onCallbackClicked(String param)
}
  1. Реализация этого интерфейса моя основная деятельность
... implements MyCallback{
// Other stuff here
@Override
public void onCallbackClicked(String param){
// Code here
}
  1. Внутри вашего FavoriteAdapter создайте переменную типа MyCallback
 MyCallback myCallback;

внутри вашего onBindViewHolder у вас должно быть что-то вроде:

@Override
    public void onBindViewHolder(final FavoriteViewHolder holder, final int mPosition) {
        final Favorite singleFavorite = listFavorites.get(mPosition);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(myCallback != null){
                    myCallback.onCallbackClicked(/* your data here */);
                 }
            }
        });
}
  1. Это важный шаг, передать слушатель (основное действие) адаптеру, вы можете передать его с помощью конструктора
public FavoriteAdapter(MyCallback myCallback){
   this.myCallback = myCallback;
}

или с помощью установщика

public void setCallback(MyCallback myCallback){
   this.myCallback = myCallback;
}

теперь тебе пора.

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