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

时间:2016-04-28 12:09:51

标签: android android-recyclerview

我有一个RecyclerView,其中包含view个/ card个(暂时称之为视图),它们都包含相同的内容,包括{{1}我用作分隔栏吧。

我希望能够在当前版本之上的View中更改此分隔栏的属性。所以说我点击显示view的卡片,我希望能够设置test3 test2中分隔栏的属性。

澄清:

我只需要引用view以查看上面的(或其他任何其他内容)我点击的内容,这就是全部。我该怎么做?

enter image description here

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();
    }
}

2 个答案:

答案 0 :(得分:8)

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

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

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

    RecyclerView mRecyclerView;

然后,在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);
}

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

mRecyclerView.getChildAt(holder.getAdapterPosition-1);

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

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

答案 1 :(得分:0)

如果您也发布了适配器代码,那将很容易,

当你点击某个项目时它会给你它的位置,你也可以通过mItems.getAdapterPosition()+1或-1来处理其他项目

这是简单的例子

在您onClickListerner的{​​{1}}中,您需要做的只是

ViewHolder