什么是接口回调呢,就是当你在B页面写好的数据,但A或C想调用的时候,直接通过B写的接口可以把数据调过来A,C这里进行相关其他的操作。而且B写的接口,A和C并不一定就会调用,只是当需要用到B里面的数据才会调用此接口,所以并不影响A,C页面本身的业务逻辑操作。
下面我敲了Recyclerview的条目监听的一个接口回调把数据从Adapter中把点击哪一条条目和position转到主页面中进行其他的操作。
public class RvAdapter extends RecyclerView.Adapter implements View.OnClickListener { private final Context context; private onItemClickListener mOnItemClickListener; public RvAdapter(Context context) { this.context = context; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View inflate = LayoutInflater.from(context).inflate(R.layout.item_view, parent, false); ViewHolder viewHolder = new ViewHolder(inflate); inflate.setOnClickListener(this); return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ViewHolder viewHolder = (ViewHolder) holder; viewHolder.itemView.setTag(position); viewHolder.setData(position); } @Override public int getItemCount() { return 10; } @Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(v, (Integer) v.getTag()); } } class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView mTextView; ImageButton mImageButton01; TextView mTextNumber; ImageButton mImageButton02; int number = 0; public ViewHolder(View itemView) { super(itemView); mTextView = itemView.findViewById(R.id.tv); mImageButton01 = itemView.findViewById(R.id.ib_01); mTextNumber = itemView.findViewById(R.id.tv_01); mImageButton02 = itemView.findViewById(R.id.ib_02); } public void setData(int position) { mTextView.setText(position + ""); } } public interface onItemClickListener { void onItemClick(View view, int postion); } public void setOnItemClickListener(onItemClickListener listener) { this.mOnItemClickListener = listener; } }这里我写了一个接口 onItemClickListener并且通过setOnItemClickListener来实现改接口。
public interface onItemClickListener { void onItemClick(View view, int postion); } public void setOnItemClickListener(onItemClickListener listener) { this.mOnItemClickListener = listener; }然后通过对view的监听把当前的view和postion设置进去方法onItemClick中
@Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(v, (Integer) v.getTag()); } }
接下来在想调用该接口的页面就可以实现该方法来进行相关操作。比如我是在主活动页面打了一个Toast来显示当前点击了哪一个条目,并且会弹出当前点击的position是多少。
public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private Context mContext; private RvAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; initView(); } private void initView() { mRecyclerView = (RecyclerView) findViewById(R.id.rv); mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext)); mAdapter = new RvAdapter(mContext); mRecyclerView.setAdapter(mAdapter); mAdapter.setOnItemClickListener(new RvAdapter.onItemClickListener() { @Override public void onItemClick(View view, int postion) { Toast.makeText(mContext, postion+"", Toast.LENGTH_SHORT).show(); } }); } }