Android 从适配器(ViewHolder)调用活动方法
我有一个类,在这个类中,我定义了一个带有一些按钮的回收器视图。在相对适配器中,我为每个按钮添加了onClick方法。在onClick方法中,我需要在另一个活动中调用一个方法。我该怎么办?我已经尝试过这个方法,但它不起作用,除非我将要调用的方法放在第一个活动中 第一个活动,我在其中声明RecyclerView: 公共类Classic_选项卡扩展片段{Android 从适配器(ViewHolder)调用活动方法,android,Android,我有一个类,在这个类中,我定义了一个带有一些按钮的回收器视图。在相对适配器中,我为每个按钮添加了onClick方法。在onClick方法中,我需要在另一个活动中调用一个方法。我该怎么办?我已经尝试过这个方法,但它不起作用,除非我将要调用的方法放在第一个活动中 第一个活动,我在其中声明RecyclerView: 公共类Classic_选项卡扩展片段{ LinkedList<Book> catalog = new LinkedList<>(); RecyclerView m
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方法。但我不想这样做,我想调用在中定义的方法该活动。如何进行?您不能假设您的活动在返回时仍然存在,例如,系统可以破坏活动以释放内存,因此您需要处理其重新创建,您无法使用简单的侦听器/回调在活动之间进行通信