【问题标题】:Send string to onClick in RecyclerViewHolder将字符串发送到 RecyclerViewHolder 中的 onClick
【发布时间】: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


【解决方案1】:

OnClickListener 实现到您的Fragment 并将构造函数传递给Adapter 和内部到每个RecyclerViewHolder

你知道在你添加的每个片段中保持staticDrawableName 会产生相同的drawable 和名称吗? (最后一组)

【讨论】:

  • 更一般地说,Java 和 Android 开发都应避免使用静态,它通常会在未来再次咬你。
  • 感谢您的反馈!我现在意识到让我的变量保持静态是行不通的。当您说“将 OnClickListener 实现到您的 Fragment 并将构造函数传递给 Adapter 并在内部传递给每个 RecyclerViewHolder”时,您是什么意思?是否有示例说明如何执行此操作来帮助指导我?
  • public class HomeFragment extends Fragment implements View.OnClickListener 并将此侦听器(使用this)传递给自定义适配器。如何创建一个你可以找到的HEREonCreateViewHolder 是将接口传递给RecyclerViewHolders 对象的合适位置。在onBindViewHolder 中,您可以为每个 itemView 设置一些标签(setTag),例如然后在onClick 中的Fragment 中读取ID 和getTag。我建议您首先摆脱所有statics(这可能会“意外”修复),然后重新发布清理后的代码
【解决方案2】:

看起来getAdapterPosition() 返回的值大于namelist 的长度(它只是一项)。试着弄清楚这一点。

【讨论】:

    【解决方案3】:

    我找到了一个帮助我解决此问题的链接,尽管我的解决方案略有不同。对于可能有相同问题的其他人。

    Passing data on click in RecyclerView.Adapter

    提醒我想要完成的事情:“我想看到我点击的按钮的名称弹出。”因此,每个按钮单击都将是唯一的,并且具有我分配给按钮的名称。

    我意识到我可以在 RecyclerViewAdapter 中访问我的点击位置和与点击关联的字符串,并将我的 onClickListener 附加到 RecyclerViewHolder。这使得解决方案比我通过将字符串列表发送到 RecyclerViewHolder 来尝试做的更简单。

    所以,在我的 RecyclerViewAdapter 中,我在自定义方法中创建了一个 onClickListener:

    private class downloadOnClickListener implements View.OnClickListener{
    
        String aName;
    
        public downloadOnClickListener(String file){
            this.aName = file;
        }
    
        @Override
        public void onClick(View v) {
    
            Log.d("tag_name", "Name of button being pressed" + aName);
    
        }
    }
    

    在 onBindViewHolder 中,我将侦听器附加到 RecyclerHolder

     @Override
    public void onBindViewHolder(RecyclerViewHolders holder, int position) {
        ItemObject itemObject = itemList.get(position);
        holder.itemObject = itemObject;
        holder.AButton.setOnClickListener(new downloadOnClickListener(itemList.get(position).getName()));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 2015-11-18
      • 2016-11-13
      • 1970-01-01
      相关资源
      最近更新 更多