使用接口将字符串从适配器传递到片段
Pass String from Adapter to Fragment using interface
此问题基于 答案。
我正在尝试将一个字符串从我的 RecyclerView.Adapter
传递到我的片段。
在我的适配器中,我添加了以下内容:
onItemClickListner onItemClickListner;
public void setOnItemClickListner(VideoAdapter.onItemClickListner onItemClickListner) {
this.onItemClickListner = onItemClickListner;
}
public interface onItemClickListner{
void onClick(String str);//pass your object types.
}
一旦我的适配器中的项目数量少于一个(适配器为空),我将传递以下字符串:
onItemClickListner.onClick("TESTING");
然后,在我的片段中添加以下内容:
//I do the following after setting my adapter
videoAdapter.setOnItemClickListner(new VideoAdapter.onItemClickListner() {
@Override
public void onClick(String str) {
Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
}
});
由于某种原因,字符串是 empty/null 并且崩溃指向 onItemClickListner.onClick("TESTING");
。
有人可以看看我做错了什么吗?
编辑:
我在 OnMenuItemClickListener
中调用 onItemClickListner.onClick("TESTING");
,如下所示:
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
onItemClickListner.onClick("TESTING");
return true;
}
我没有提供整个片段,因为我只是在 onCreateView
.
中添加了上面的内容
你注意到了吗?来自您的参考
onItemClickListner your_interface;
public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
this.your_interface= onItemClickListner;
}
this.onItemClickListner = onItemClickListner
这将是自我分配。这可能是导致问题的原因。
这里 your_interface
正在初始化。我怀疑你的 onItemClickListner
没有初始化 .
所以尝试更改名称
这是我工作的一部分RecyclerView.Adapter示例
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
final PopupMenu popupMenu = new PopupMenu(context, holder.itemView);
popupMenu.inflate(R.menu.simple_menu);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
if (onEmptyListListener != null) {
onEmptyListListener.onEmpty("example string");
}
return true;
default:
return false;
}
}
});
final String name = values.get(position);
holder.txtHeader.setText(name);
holder.txtFooter.setText("Footer: " + name);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupMenu.show();
}
});
}
其余代码与您的相似,toasts 显示正常。
首先感谢大家的回答和评论。
我通过执行以下操作解决了这个问题。
在我的 Adapter
中添加了以下内容:
private UpdateInterface listner;
public interface UpdateInterface {
void recyclerviewOnUpdate(int amount);
}
public VideoAdapter(Context context, ArrayList<PathModel> thumbPathList, ArrayList<PathModel> videoPathList, UpdateInterface listner) {
this.context = context;
this.thumbPathList = thumbPathList;
this.videoPathList = videoPathList;
//I added this
this.listner=listner;
}
我调用接口的方式与我在问题中的调用方式相同:
//Passing the amount of items in adapter
listner.recyclerviewOnUpdate(getItemCount());
它与我上面所做的非常相似,但现在我在我的片段中实现了这样的接口:
public class VideoFragment extends Fragment implements VideoAdapter.UpdateInterface
现在我有一个方法可以使用,如下所示:
@Override
public void recyclerviewOnUpdate(int amount) {
//Now I can get the int and check if the adapter is empty after removing a item
if (amount<1) {
txtEmptyAdapter.setVisibility(View.VISIBLE);
}
}
此问题基于
我正在尝试将一个字符串从我的 RecyclerView.Adapter
传递到我的片段。
在我的适配器中,我添加了以下内容:
onItemClickListner onItemClickListner;
public void setOnItemClickListner(VideoAdapter.onItemClickListner onItemClickListner) {
this.onItemClickListner = onItemClickListner;
}
public interface onItemClickListner{
void onClick(String str);//pass your object types.
}
一旦我的适配器中的项目数量少于一个(适配器为空),我将传递以下字符串:
onItemClickListner.onClick("TESTING");
然后,在我的片段中添加以下内容:
//I do the following after setting my adapter
videoAdapter.setOnItemClickListner(new VideoAdapter.onItemClickListner() {
@Override
public void onClick(String str) {
Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
}
});
由于某种原因,字符串是 empty/null 并且崩溃指向 onItemClickListner.onClick("TESTING");
。
有人可以看看我做错了什么吗?
编辑:
我在 OnMenuItemClickListener
中调用 onItemClickListner.onClick("TESTING");
,如下所示:
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
onItemClickListner.onClick("TESTING");
return true;
}
我没有提供整个片段,因为我只是在 onCreateView
.
你注意到了吗?来自您的参考
onItemClickListner your_interface;
public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
this.your_interface= onItemClickListner;
}
this.onItemClickListner = onItemClickListner
这将是自我分配。这可能是导致问题的原因。
这里 your_interface
正在初始化。我怀疑你的 onItemClickListner
没有初始化 .
所以尝试更改名称
这是我工作的一部分RecyclerView.Adapter示例
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
final PopupMenu popupMenu = new PopupMenu(context, holder.itemView);
popupMenu.inflate(R.menu.simple_menu);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
if (onEmptyListListener != null) {
onEmptyListListener.onEmpty("example string");
}
return true;
default:
return false;
}
}
});
final String name = values.get(position);
holder.txtHeader.setText(name);
holder.txtFooter.setText("Footer: " + name);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupMenu.show();
}
});
}
其余代码与您的相似,toasts 显示正常。
首先感谢大家的回答和评论。
我通过执行以下操作解决了这个问题。
在我的 Adapter
中添加了以下内容:
private UpdateInterface listner;
public interface UpdateInterface {
void recyclerviewOnUpdate(int amount);
}
public VideoAdapter(Context context, ArrayList<PathModel> thumbPathList, ArrayList<PathModel> videoPathList, UpdateInterface listner) {
this.context = context;
this.thumbPathList = thumbPathList;
this.videoPathList = videoPathList;
//I added this
this.listner=listner;
}
我调用接口的方式与我在问题中的调用方式相同:
//Passing the amount of items in adapter
listner.recyclerviewOnUpdate(getItemCount());
它与我上面所做的非常相似,但现在我在我的片段中实现了这样的接口:
public class VideoFragment extends Fragment implements VideoAdapter.UpdateInterface
现在我有一个方法可以使用,如下所示:
@Override
public void recyclerviewOnUpdate(int amount) {
//Now I can get the int and check if the adapter is empty after removing a item
if (amount<1) {
txtEmptyAdapter.setVisibility(View.VISIBLE);
}
}