繁体   English   中英

将侦听器传递给回收器适配器

[英]Passing a listener to a recycler adapter

我已经知道回收器查看器的工作原理以及对接口侦听器的良好理解,但我想知道为什么我们需要将侦听器传递给我的回收器适配器,称为mAdapter = new GreenAdapter 在我的MainActivity.java我有这样的东西

public class MainActivity extends AppCompatActivity implements GreenAdapter.ListItemClickListener {

private static final int NUM_LIST_ITEMS = 100;

private GreenAdapter mAdapter;
private RecyclerView mNumbersList;
private Toast mToast;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAdapter = new GreenAdapter(NUM_LIST_ITEMS, this);
    mNumbersList.setAdapter(mAdapter);
}

@Override
public void onListItemClick(int clickedItemIndex) {
    String toastMessage = "Item #" + clickedItemIndex + "clicked.";
    mToast = Toast.makeText(this, toastMessage, Toast.LENGTH_LONG);
    mToast.show();

}

在我的GreenAdapter.java中,我知道我的 Viewholder 构造函数将调用我的名为ListItemClickedListener的自定义接口,传入点击视图的 position 并从那里我可以实现代码,当用户通过我的onListItemClick抽象方法点击它时会发生什么

public class GreenAdapter extends RecyclerView.Adapter<GreenAdapter.NumberViewHolder> {

private static final String TAG = GreenAdapter.class.getSimpleName();

private int mNumberItems;
final private ListItemClickListener mOnClickListener;

public interface ListItemClickListener{
    void onListItemClick(int clickedItemIndex);

}


public GreenAdapter(int numberOfItems, ListItemClickListener listener) {
    mNumberItems = numberOfItems;
    mOnClickListener = listener;
}


@Override
public NumberViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

    Context context = viewGroup.getContext();
    int layoutIdForListItem = R.layout.number_list_item;
    LayoutInflater inflater = LayoutInflater.from(context);
    boolean shouldAttachToParentImmediately = false;
    View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
    NumberViewHolder viewHolder = new NumberViewHolder(view);

    return viewHolder;
}


@Override
public void onBindViewHolder(NumberViewHolder holder, int position) {
    Log.d(TAG, "#" + position);
    holder.bind(position);
}


@Override
public int getItemCount() {
    return mNumberItems;
}


class NumberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

   
    TextView listItemNumberView;

  
    public NumberViewHolder(View itemView) {
        super(itemView);

        listItemNumberView = (TextView) itemView.findViewById(R.id.tv_item_number);
        itemView.setOnClickListener(this);
    }

    void bind(int listIndex) {
        listItemNumberView.setText(String.valueOf(listIndex));
    }

    @Override
    public void onClick(View view) {
        int clickedPosition = getAdapterPosition();
        mOnClickListener.onListItemClick(clickedPosition);
    }
}

我只是困惑为什么我们需要在我的回收器适配器中传递this

通过传递this ,您实际上是在传递MainActivity.java的 object,它正在实现GreenAdapter.ListItemClickListener接口。 现在,当您的用户单击项目时,您可以让您的活动知道用户单击了列表中的哪个项目,然后将业务逻辑的 rest 写入MainActivityonListItemClick()方法中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM