Android 从适配器(ViewHolder)调用活动方法

Android 从适配器(ViewHolder)调用活动方法,android,Android,我有一个类,在这个类中,我定义了一个带有一些按钮的回收器视图。在相对适配器中,我为每个按钮添加了onClick方法。在onClick方法中,我需要在另一个活动中调用一个方法。我该怎么办?我已经尝试过这个方法,但它不起作用,除非我将要调用的方法放在第一个活动中 第一个活动,我在其中声明RecyclerView: 公共类Classic_选项卡扩展片段{ LinkedList<Book> catalog = new LinkedList<>(); RecyclerView m

我有一个类,在这个类中,我定义了一个带有一些按钮的回收器视图。在相对适配器中,我为每个按钮添加了onClick方法。在onClick方法中,我需要在另一个活动中调用一个方法。我该怎么办?我已经尝试过这个方法,但它不起作用,除非我将要调用的方法放在第一个活动中

第一个活动,我在其中声明RecyclerView:

公共类Classic_选项卡扩展片段{

LinkedList<Book> catalog = new LinkedList<>();

RecyclerView mRecyclerView;
BookListAdapter mAdapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View fragmentView = inflater.inflate(R.layout.classici_tab, container, false);

    fillCatalog("catalog.csv");     //fill the LinkedList

    mRecyclerView = (RecyclerView) fragmentView.findViewById(R.id.classici_rv);
    mAdapter = new BookListAdapter(getContext(), catalog);
    mRecyclerView.setAdapter(mAdapter);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    return fragmentView;
}
}
LinkedList目录=新建LinkedList();
回收视图mRecyclerView;
书单;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图碎片视图=充气机。充气(R.layout.classici_选项卡,容器,false);
fillCatalog(“catalog.csv”);//填写LinkedList
mRecyclerView=(RecyclerView)fragmentView.findviewbyd(R.id.classici_rv);
mAdapter=newbooklistadapter(getContext(),catalog);
mRecyclerView.setAdapter(mAdapter);
setLayoutManager(新的LinearLayoutManager(getContext());
返回碎片视图;
}
}
}

适配器:

public class BookListAdapter extends RecyclerView.Adapter<BookListAdapter.BookViewHolder> {

    static Drawable borrow_top;
    static Drawable reserve_top;

    public BookListAdapter()
    {}

    // View Holder
    class BookViewHolder extends RecyclerView.ViewHolder
    {
        public final Button borrow;
        public final Button addfavorites;
        final BookListAdapter mAdapter;


        public BookViewHolder(final View itemView, BookListAdapter adapter) {
            super(itemView);
            borrow = (Button)itemView.findViewById(R.id.borrow);
            addfavorites = (Button)itemView.findViewById(R.id.addfavorites);

            this.mAdapter = adapter;

            addfavorites.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final int cover_book = R.id.cover;
                    final String title_book = title.getText().toString();
                    final String author_book = author.getText().toString();

                    add_to_fav(itemView, new Book(cover_book, title_book, author_book));    //METHOD TO BE CALLED
                }
            });
        }
    }

    private LinkedList<Book> mBookList = new LinkedList<>();            //per Classici_Tab TODO
    private LinkedList<Book> mBookListFavorites = new LinkedList<>();     //per Favorites_page
    private LayoutInflater mInflater;
    boolean isVisible = false;
    public ItemTouchHelper.Callback callback;

    ClickListener clickListener;

    public BookListAdapter(Context context, LinkedList<Book> bookList) {
        mInflater = LayoutInflater.from(context);
        this.mBookList = bookList;
    }

    @Override
    public BookViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View mItemView = mInflater.inflate(R.layout.tab_list_item, parent, false);
        return new BookViewHolder(mItemView, this);
    }

    @Override
    public void onBindViewHolder(final BookViewHolder holder, int position) {
       ...
    }

    @Override
    public int getItemCount() {
        ...
    }

    //INTERFACE TO CALL THE METHOD (IN THE SECOND ACTIVITY)
    public void setClickListener(ClickListener clickListener) {
        this.clickListener = clickListener;
    }

    public void add_to_fav(View v, Book book)
    {
        if(clickListener != null)
        {
            clickListener.itemClicked(v, book);
        }
    }

    public interface ClickListener
    {
        void itemClicked(View view, Book book);
    }
}
公共类BookListAdapter扩展了RecyclerView.Adapter{
静态可抽出式借土器顶部;
静态可采储量;
公共BookListAdapter()
{}
//视图持有者
类BookViewHolder扩展了RecyclerView.ViewHolder
{
公共最终按钮借用;
公共最终按钮添加收藏夹;
最终图书清单;
公共BookViewHolder(最终视图项视图、BookListAdapter适配器){
超级(项目视图);
借用=(按钮)itemviewbyd(R.id.borrow);
addfavorites=(按钮)itemView.findViewById(R.id.addfavorites);
this.mAdapter=适配器;
addfavorites.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
最终内部封面=R.id.封面;
最终字符串title_book=title.getText().toString();
最后一个字符串author\u book=author.getText().toString();
将_添加到_fav(itemView,newbook(cover_Book,title_Book,author_Book));//要调用的方法
}
});
}
}
private LinkedList mBookList=新建LinkedList();//每个Classic_选项卡待办事项
私有LinkedList mBookListFavorites=新建LinkedList();//每个收藏夹\u页面
私人停车场;
布尔值isVisible=false;
public ItemTouchHelper.Callback;
点击监听器点击监听器;
公共BookListAdapter(上下文上下文,LinkedList bookList){
mInflater=LayoutInflater.from(上下文);
this.mBookList=图书列表;
}
@凌驾
public BookViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图mItemView=mInflater.flate(R.layout.tab\u列表\u项,父项,false);
返回新的BookViewHolder(mItemView,本);
}
@凌驾
BindViewHolder上的公共作废(最终账簿持有人,内部位置){
...
}
@凌驾
public int getItemCount(){
...
}
//调用方法的接口(在第二个活动中)
公共无效设置ClickListener(ClickListener ClickListener){
this.clickListener=clickListener;
}
公共无效添加到fav(视图v,书本)
{
如果(clickListener!=null)
{
单击Listener.itemClicked(v,book);
}
}
公共界面ClickListener
{
单击作废项目(视图、书本);
}
}
第二个活动,我在其中声明方法:

public class Favorites_Page extends Activity implements BookListAdapter.ClickListener {

    RecyclerView favorites_rv;
    BookListAdapter mAdapter_List;
    LinkedList<Book> favorites = new LinkedList<>();

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

        favorites_rv = (RecyclerView)findViewById(R.id.favorites_rv);
        favorites_rv.setAdapter(mAdapter);
        favorites_rv.setLayoutManager(new LinearLayoutManager(this));

        mAdapter_List = new BookListAdapter();
        mAdapter_List.clickListener = (BookListAdapter.ClickListener)this;
    }


    @Override
    public void itemClicked(View view, Book book) {
        Toast.makeText(getApplicationContext(), "the method has been called successfully", Toast.LENGTH_SHORT).show();
    }
}
公共类收藏夹\u页面扩展活动实现BookListAdapter.ClickListener{
RecyclerView收藏夹_rv;
BookListAdapter mAdapter_列表;
LinkedList favorites=新建LinkedList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.favorites_页面);
favorites_rv=(RecyclerView)findViewById(R.id.favorites_rv);
最爱的设置适配器(mAdapter);
收藏夹\u rv.setLayoutManager(新的LinearLayoutManager(本));
mAdapter_List=new BookListAdapter();
mAdapter_List.clickListener=(BookListAdapter.clickListener)这个;
}
@凌驾
已单击公共无效项(视图、书本){
Toast.makeText(getApplicationContext(),“已成功调用该方法”,Toast.LENGTH\u SHORT.show();
}
}

您需要序列化才能在两个活动之间进行通信。例如:

addfavorites.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final int cover_book = R.id.cover;
            final String title_book = title.getText().toString();
            final String author_book = author.getText().toString();

            Intent intent = new Intent( CurrentActivityClass.this, Favorites_Page.class )
            intent.putExtra(Favorites_Page.KEY_BOOK , Book) // Book need to implements Parcelable (or Serializable if all content is Serializable)
           CurrentActivityClass.this.startActivity(intent)
        }
    });
然后从您的fav活动中,您可以获得如下数据:

public class Favorites_Page extends Activity {

    public static final String KEY_BOOK = "book"
    RecyclerView favorites_rv;
    BookListAdapter mAdapter_List;
    LinkedList<Book> favorites = new LinkedList<>();

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

        ...

        Book book = getIntent().getExtra(KEY_BOOK)
        ...
    }
...
公共类收藏夹\u页面扩展活动{
公共静态最终字符串键\u BOOK=“BOOK”
RecyclerView收藏夹_rv;
BookListAdapter mAdapter_列表;
LinkedList favorites=新建LinkedList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.favorites_页面);
...
Book Book=getIntent().getExtra(键书)
...
}
...

您一次只能运行一个活动,不能在不同的活动中调用方法。在任何情况下,您都必须启动第二个具有意图的活动,并将其所需的数据作为意图中的附加内容传递。通过这样做,我可以调用该活动的onCreate方法。但我不想这样做,我想调用在中定义的方法该活动。如何进行?您不能假设您的活动在返回时仍然存在,例如,系统可以破坏活动以释放内存,因此您需要处理其重新创建,您无法使用简单的侦听器/回调在活动之间进行通信