Не удается получить CoordinatorLayout внутри RecylerAdapter через findViewById
Что я пытаюсь сделать?
у меня есть RecyclerView
который держит ряды и выглядит как ListView
, Строки этого списка определены в feed_listview_row.xml
, у меня есть RecyclerAdapter
за это RecyclerView
и это называется Feed_Recycler_Adapter.java
который вы можете увидеть внизу.
Я хочу показать AlertDialog
когда пользователь Long нажал одну из этих строк. Возникает вопрос, хочет ли пользователь удалить эту строку или сохранить ее. После того, как пользователь согласится удалить строку. Будут SnackBar
уведомить пользователя и дать ему / ей последний шанс забрать его обратно.
проблема
Я не могу просмотреть SnackBar
потому что я не могу показать CoordinatorLayout
,
Код
Feed_Recycler_Adapter.java
holder.layout.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
cl = (CoordinatorLayout) v.findViewById(R.id.FeedCoordinatorLayout);
/*this row above is failing to fill the cl variable.
This cl variable returns null! I need to get the coordinatorlayout for snackbar*/
String selectedListId = mDataset.get(position).getListId();
String selectedPostId = mDataset.get(position).getPostId();
Push_Options.ownerOrfollower(v.getContext(), selectedListId, selectedPostId, cl);
return true;
}
});
Я старался
Я попытался раздуть content_feed в Feed_Recycler_Adapter.ViewHolder onCreateViewHolder и использовать его как представление для получения FeedCoordinatorLayout, не решил проблему, но не получил никакой ошибки просто потому, что cl не был нулевым. Но не показал SnackBar
или.
2 ответа
Я нашел решение с небольшой помощью из ответа Дариуш Ф.
Я изменил свой существующий конструктор, чтобы иметь поле CoordinatorLayout.
class Feed_Recycler_Adapter extends RecyclerView.Adapter<Feed_Recycler_Adapter.ViewHolder> {
public static String TAG = "Feed Recycler Adapter";
private CoordinatorLayout cl;
private ArrayList<Feed_List_Class> mDataset;
//CoordinatorLayout cl;
// Provide a suitable constructor (depends on the kind of dataset)
Feed_Recycler_Adapter(ArrayList<Feed_List_Class> myDataset,CoordinatorLayout coordinatorLayout) {
cl=coordinatorLayout;
mDataset = myDataset;
}
И я отправляю макет координатора, когда я создаю экземпляр этого адаптера. Как это:
CoordinatorLayout cl = (CoordinatorLayout) findViewById(R.id.FeedCoordinatorLayout) ;
mAdapter = new Feed_Recycler_Adapter(posts,cl);
Так как мой метод onLongClick уже находится внутри моего класса Adapter, я могу создать снэк-бар с моей переменной cl, которая устанавливается моим конструктором.
Push_Options.ownerOrfollower(v.getContext(), selectedListId, selectedPostId, cl);
Я прочитал некоторую часть вашего огромного вопроса и обнаружил, что вам нужен rootView (ordinatorLayout)
это может помочь вам:
добавить конструктор YourAdapter
с Context
пары:
public yourAdapter(Context activity){
context = activity // context is local object
}
теперь в своей деятельности, где вы создаете экземпляр YourAdapter, сделайте это:
adapter = new YourAdapter(YourActivity.this);
и когда вы хотите показать snakBar:
Snackbar.make(((YourActivity) context).coordinatorLayout, "Post deleted.", Snackbar.LENGTH_LONG).show()
Обязательно определите ordinatorLayout в классе YourActivity.