如何从另一个ViewHolder中获取对ViewHolder的引用?(RecyclerView)

Tim*_*j93 12 android android-recyclerview

我有RecyclerView一些view's/card(我现在称它为视图),它们都包含相同的东西,包括View我用作分隔条的东西.

我希望能够view在当前的上面更改此分隔栏的属性.所以说我点击说明的卡片test3,我希望能够设置分隔栏的属性test2 view.

澄清:

我只需要参考上面ViewHolder的视图(或任何其他的)我点击的那个,就是全部.我该怎么做?

在此输入图像描述

public class StuffManagerAdapter extends RecyclerView.Adapter<StuffManagerAdapter.MyViewHolder> {

    private List<StuffManagerClass> stuffList;
    private Context context;
    private String TAG = "CStA";
    DBHandler dbHandler;
    ArrayList<String> tagArray = new ArrayList<>();
    RecyclerView mRecyclerView;

    public StuffManagerAdapter(List<StuffManagerClass> stuffList, Context context) {
        this.stuffList = stuffList;
        this.context = context;
        dbHandler = DBHandler.getInstance(context);
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView DeviceTV, NameTV, TagTV;
        private ImageButton editButton, deleteButton;
        public ImageView tagWarningImage;
        View view, bottomBar ,cover;

        public MyViewHolder(final View view) {
            super(view);
            this.view = view;
            DeviceTV = (TextView) view.findViewById(R.id.SMVFDeviceTextView);
            // etc., etc.

            editButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // do stuff
                }
            });
            deleteButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // do stuff
                }
            });
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_stuffmanagervariablefragment, parent, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        final StuffManagerClass sc = stuffList.get(position);

        // Initialize card, set all textviews
        holder.DeviceTV.setText(sc.getDevice());
        holder.NameTV.setText(sc.getName());
        holder.TagTV.setText(sc.getTag());
        sc.setPosition(position);


        holder.view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {    
                // This is where I would like to get a reference to the divider bar on the other view/card
            }
        });
    }

    @Override
    public int getItemCount() {
        return stuffList.size();
    }
}
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <!-- TextViews and stuff -->

        <View
            android:id="@+id/SMVFDividerBar"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:layout_below="@+id/LL2"
            android:layout_centerHorizontal="true"
            android:layout_marginLeft="7dp"
            android:layout_marginRight="7dp"
            android:background="@color/colorPrimaryDark">

    </RelativeLayout>

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

Tim*_*j93 8

不知道为什么我没有早点意识到这一点,但它确实有效.

首先,创建一个实例变量(如果这不是实例变量,请纠正我).

public class StuffManagerAdapter extends 
                    RecyclerView.Adapter<StuffManagerAdapter.MyViewHolder> {

    RecyclerView mRecyclerView;
Run Code Online (Sandbox Code Playgroud)

然后,在onCreateViewHolder()方法中分配此变量,如下所示:

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.thingy, parent, false);
    mRecyclerView = (RecyclerView) parent;
    return new MyViewHolder(itemView);
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的onBindViewHolder()方法中,您可以ViewHolder像这样访问其他人:

mRecyclerView.getChildAt(holder.getAdapterPosition-1);
Run Code Online (Sandbox Code Playgroud)

您可以将其设置为变量,或findViewById()直接调用其上的内容.

显然,您可以在getChildAt()语句中手动输入所需的任何位置,并且可以使用查找视图中的任何对象findViewById().

  • 难道更好的方法是覆盖`onAttachedToRecyclerView(RecyclerView recyclerView)`方法并在该方法中设置`mRecyclerView = recyclerView`? (7认同)
  • 这也很有用:mRecyclerView.findViewHolderForAdapterPosition(position); (4认同)