0

Что я пытаюсь сделать?Не удается получить CoordinatorLayout внутри RecylerAdapter через findViewById

У меня есть RecyclerView, который держит строки и выглядит как ListView. Строки этого списка определены в feed_listview_row.xml. У меня есть RecyclerAdapter для этого RecyclerView, и он называется Feed_Recycler_Adapter.java, который вы можете увидеть ниже.

Я хочу показать AlertDialog, когда пользователь долго щелкал по одной из этих строк. Возникает вопрос, хотите ли пользователи удалить эту строку или сохранить ее. После того как пользователь согласится удалить строку. Будет 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.

ответ

0

Я нашел решение с небольшой помощью от ответа dariush f.

Я изменил свой существующий конструктор, чтобы иметь поле 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 уже внутри моего класса адаптера я могу создать закусочную с моей переменной кл которая задается моим конструктором.

Push_Options.ownerOrfollower(v.getContext(), selectedListId, selectedPostId, cl); 
0

я прочитал какую-то часть вашего огромного вопроса и найти, что вам нужно rootView (coordinatorLayout)
это возможно, поможет вам:
добавить конструктор 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() 

Обязательно определите координаторLayout в классе YourActivity.