【发布时间】:2016-05-25 06:17:37
【问题描述】:
我正在创建一个使用 RecyclerView 填充动态按钮和字符串的 GridLayout。每个按钮和字符串一次添加到视图中,每次添加一个按钮和字符串时,我想将动态字符串发送到我的按钮在 RecyclerViewHolder 中的 onClick。
我试着用这个问题作为指导:
how to send data using bundle inside RecyclerView onclick method
但他们有一组字符串和可绘制对象发送到他们的 RecyclerView.ViewHolder,而我的是动态创建的。这就是我所在的位置,我们将不胜感激!
RecyclerView.ViewHolder 我想将我的字符串发送到 onClick。在我的日志中,我想查看我点击弹出的按钮的名称。
public class RecyclerViewHolders extends RecyclerView.ViewHolder
implements View.OnClickListener
{
public TextView AName;
public ImageButton AButton;
ItemObject itemObject;
List<ItemObject> namelist=HomeFragment.getListdata();
public RecyclerViewHolders(View itemView) {
super(itemView);
AName = (TextView) itemView.findViewById(R.id.new_name);
AButton = (ImageButton) itemView.findViewById(R.id.new_button);
itemView.findViewById(R.id.new_button).setOnClickListener(this);
}
public void onClick(View view) {
String name = namelist.get(getAdapterPosition()).getName();
Log.d("tag_name", "Name of button that was clicked" + name);
}
}
我的 Activity 启动 RecyclerView,我试图从中发送字符串。 “createButton”方法是drawable和string首先从另一个方法发送到的地方:
public class HomeFragment extends Fragment {
private GridLayoutManager lLayout;
RecyclerViewAdapter rcAdapter;
private static Context mContext;
static String Name;
static Drawable draw;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getContext();
List<ItemObject> myList = new ArrayList<>();
rcAdapter = new RecyclerViewAdapter(getActivity(), myList);
}
// onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.home_fragment, container, false);
Log.d("tag_name", "Go through onCreateView");
lLayout = new GridLayoutManager(getActivity(), 2,
GridLayoutManager.HORIZONTAL, false);
RecyclerView rView = (RecyclerView) view.findViewById(R.id.recycler_view);
rView.setHasFixedSize(true);
rView.setLayoutManager(lLayout);
rView.setAdapter(rcAdapter);
return view;
}
public void createButton(Drawable d, String aName) {
Name = aName;
draw = d;
Log.d("tag_name", "Make sure createButton is called" + rcAdapter);
rcAdapter.addItem(new ItemObject(aName, d));
}
public static List<ItemObject> getListdata() {
Log.d("tag_name", "List to send to onClickListener" + Name);
List<ItemObject> namelist = new ArrayList<>();
namelist.add(new ItemObject(Name,draw));
return namelist;
}
}
还有ItemObject:
public class ItemObject {
private String name;
private Drawable d;
public ItemObject(String name, Drawable d) {
this.name = name;
this.d = d;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Drawable getPhoto() {
return d;
}
public void setPhoto(Drawable d) {
this.d = d;
}
}
我当前的错误,发生在 RecyclerViewHolders 中,我在其中定义了“字符串名称”:
05-24 14:12:53.350 7295-7295/it.anddev.bradipao.janus W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x437c0160)
05-24 14:12:53.360 7295-7295/it.anddev.bradipao.janus E/AndroidRuntime: FATAL EXCEPTION: main
Process: it.anddev.bradipao.janus, PID: 7295
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at it.anddev.bradipao.janus.RecyclerViewHolders.onClick(RecyclerViewHolders.java:50)
at android.view.View.performClick(View.java:4487)
at android.view.View$PerformClick.run(View.java:18746)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
-
您的视图持有者应该从适配器的列表中获取数据。您正在从
HomeFragment.getListdata();中提取数据,如果将新项目添加到 RecyclerView,则该数据不会更新。 -
@cyroxis 我明白了...如何从我的 RecyclerViewHolder 中的适配器访问列表?
-
通常通过使您的 ViewHolder 成为 RecyclerAdpater 的内部类。或者,您可以在 ViewHolder 的构造函数中传递 RecyclerAdpater。
标签: java android android-recyclerview bundle