recyclerview 中的 Snackbar
Snackbar in recyclerview
如何在页面底部显示快餐栏?我想在点击喜欢时显示小吃店。我在 recycleview (crdLayout) 的项目中使用了 snackbar,因此它已显示在每个项目的底部
这是代码:
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
itemHolder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar snackbar = Snackbar
.make(itemHolder.crdLayout, "liked", Snackbar.LENGTH_LONG)
snackbar1.show();
}
});
snackbar 每次都不会在页面底部弹出,而是出现在每个 cardview 的底部
在您的 Snackbar
中,您将参数指定为 itemholder.cardLayout
。因此 snackbar 将出现在卡片布局下方。你应该给页面的根视图,让它出现在页面的底部
您可以通过两种方式实现这一目标。一种是在RecyclerViewAdapter
class的构造函数中传递rootview
,将参数传递给Snackbar
。另一种方法是在 Activity
或 Fragment
class 中使用回调方法调用 RecyclerViewAdapter
class.
对于第一种方法,您只需将页面的rootView
作为构造函数参数传递,并将参数传递给Snackbar
。
对于第二种方法,可以在RecyclerViewAdapter
class中创建一个接口,在构造函数中将接口实例作为参数传递,在接口中创建一个方法并通知方法该项目已被点击。然后您可以在 Activity
class 本身中显示 Snackbar
。看下面的代码,
public class YourActivity implements RecyclerViewAdapter.CallbackListener{
View rootView;
@Override
protected void onCreate(Bundle savedInstanceState){
//
rootView = findViewById(R.id.my_root_view);
//
//
RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this);
//
//
}
@Override
public void onItemClicked(){
Snackbar snackbar = Snackbar.make(rootView, "liked", Snackbar.LENGTH_LONG);
snackbar.show();
}
}
你的 RecyclerViewAdapter class 将是,
public class RecyclerViewAdapter {
CallbackListener listener;
public RecyclerViewAdapter (CallbackListener listener){
this.listener = listener;
}
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
itemHolder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClicked();
}
});
public interface CallbackListener{
void onItemClicked();
}
}
虽然第一种方法很简单,但第二种方法给你更多的封装,更简洁的代码和更多的代码控制。
- 在您现有的
Activity
布局中设置 CoordinatorLayout
。
- 将
CoordinatorLayout
作为第一个参数
Snackbar.make()
命令。
因此最后它应该是这样的:
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
itemHolder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final View my_new_view = findViewById(R.id.myCoordinatorLayout); //define your CoordinatorLayout
Snackbar snackbar = Snackbar
.make(myCoordinatorLayout, "liked", Snackbar.LENGTH_LONG); //set CoordinatorLayout as first argument
snackbar1.show();
}
});
您的 Snackbar
显示在 CoordinatorLayout
的底部。
如果您尝试在整个屏幕上显示 Snackbar,不要将父 Activity/Fragment
的 View/ViewGroup/Layout
传递给适配器。
而是将 Callback/Listener
从 Activity/Fragment
传递给 RecyclerView Adapter
。这样,当单击项目时,您会触发回调。 Activity/Fragment
监听该回调将被触发,您现在可以显示 Snackbar/Toast/CustomView...
如何在页面底部显示快餐栏?我想在点击喜欢时显示小吃店。我在 recycleview (crdLayout) 的项目中使用了 snackbar,因此它已显示在每个项目的底部 这是代码:
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
itemHolder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar snackbar = Snackbar
.make(itemHolder.crdLayout, "liked", Snackbar.LENGTH_LONG)
snackbar1.show();
}
});
snackbar 每次都不会在页面底部弹出,而是出现在每个 cardview 的底部
在您的 Snackbar
中,您将参数指定为 itemholder.cardLayout
。因此 snackbar 将出现在卡片布局下方。你应该给页面的根视图,让它出现在页面的底部
您可以通过两种方式实现这一目标。一种是在RecyclerViewAdapter
class的构造函数中传递rootview
,将参数传递给Snackbar
。另一种方法是在 Activity
或 Fragment
class 中使用回调方法调用 RecyclerViewAdapter
class.
对于第一种方法,您只需将页面的rootView
作为构造函数参数传递,并将参数传递给Snackbar
。
对于第二种方法,可以在RecyclerViewAdapter
class中创建一个接口,在构造函数中将接口实例作为参数传递,在接口中创建一个方法并通知方法该项目已被点击。然后您可以在 Activity
class 本身中显示 Snackbar
。看下面的代码,
public class YourActivity implements RecyclerViewAdapter.CallbackListener{
View rootView;
@Override
protected void onCreate(Bundle savedInstanceState){
//
rootView = findViewById(R.id.my_root_view);
//
//
RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this);
//
//
}
@Override
public void onItemClicked(){
Snackbar snackbar = Snackbar.make(rootView, "liked", Snackbar.LENGTH_LONG);
snackbar.show();
}
}
你的 RecyclerViewAdapter class 将是,
public class RecyclerViewAdapter {
CallbackListener listener;
public RecyclerViewAdapter (CallbackListener listener){
this.listener = listener;
}
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
itemHolder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClicked();
}
});
public interface CallbackListener{
void onItemClicked();
}
}
虽然第一种方法很简单,但第二种方法给你更多的封装,更简洁的代码和更多的代码控制。
- 在您现有的
Activity
布局中设置CoordinatorLayout
。 - 将
CoordinatorLayout
作为第一个参数Snackbar.make()
命令。
因此最后它应该是这样的:
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
itemHolder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final View my_new_view = findViewById(R.id.myCoordinatorLayout); //define your CoordinatorLayout
Snackbar snackbar = Snackbar
.make(myCoordinatorLayout, "liked", Snackbar.LENGTH_LONG); //set CoordinatorLayout as first argument
snackbar1.show();
}
});
您的 Snackbar
显示在 CoordinatorLayout
的底部。
如果您尝试在整个屏幕上显示 Snackbar,不要将父 Activity/Fragment
的 View/ViewGroup/Layout
传递给适配器。
而是将 Callback/Listener
从 Activity/Fragment
传递给 RecyclerView Adapter
。这样,当单击项目时,您会触发回调。 Activity/Fragment
监听该回调将被触发,您现在可以显示 Snackbar/Toast/CustomView...