前提
1、各位看官大家好,小可今天又來裝,啊呸,又來寫幹貨來了。在自定義Android接口之前先要搞清楚什麼是接口
2、接口定義
- 大家都知道Android是基于Java語言開發的,嗯,之前是,當然現在也有Kotin,今天主要講解Java方面。
- 接口(英文:Interface),在JAVA程式設計語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個類通過繼承接口的方式,進而來繼承接口的抽象方法。
- 接口并不是類,編寫接口的方式和類很相似,但是它們屬于不同的概念。類描述對象的屬性和方法。接口則包含類要實作的方法。除非實作接口的類是抽象類,否則該類要定義接口中的所有方法。
-
接口無法被執行個體化,但是可以被實作。一個實作接口的類,必須實作接口内所描述的所有方法,否則就必須聲明為抽象類。另外,在 Java 中,接口類型可用來聲明一個變量,他們可以成為一個空指針,或是被綁定在一個以此接口實作的對象。
3、實作方法
- 相信上面對接口的說明大家都可以了解,但是,自定義接口又是什麼樣子的呢,相信還是比較抽象的,是以今天就小可就在此舉一個例子來介紹一下
首先
- 先分析一下,我們今天要自定義的接口要有什麼訴求(即要實作什麼功能)自定義接口是為了更好的傳遞我們想要傳遞的值。
- 大家都知道Recyclerview沒有自帶點選事件,今天就以Recyclerview的點選事件為例,來介紹一下自定義接口
- 定義一個接口類
public interface OnItemClickListener {
//第一個參數是擴充卡的item,第二個參數是位置
- 短按事件
void OnItemClick(View view,int position);
長按事件
void OnItemLongClick(View view,int position);
}
其次
- 要實作Recyclerview的點選事件,當然要定義一個擴充卡了
public class CustomAdapter extends RecyclerView.Adapter
<CustomAdapter.CustomViewHolder> {
private List<CustomBean> mList;
private Context mContext;
private LayoutInflater mInflater;
private OnItemClickListener mOnItemClickListener;
public CustomAdapter(List<CustomBean> mList, Context context) {
this.mList = mList;
this.mContext = context;
this.mInflater = LayoutInflater.from(mContext);
}
@Override
public CustomViewHolder onCreateViewHolder(ViewGroup
parent, int viewType) {
View view = mInflater.inflate(R.layout.item_custom_layout,
parent, false);
CustomViewHolder viewHolder = new CustomViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder( CustomViewHolder holder, int position) {
holder.mTxtItemTitle.setText(mList.get(position).getTitle());
holder.mTxtItemContent.setText(mList.get(position).getContent());
//設定點選事件
setUIEvent(holder);
}
@Override
public int getItemCount() {
return mList==null?0:mList.size();
}
class CustomViewHolder extends RecyclerView.ViewHolder {
TextView mTxtItemTitle, mTxtItemContent;
public CustomViewHolder(View itemView) {
super(itemView);
mTxtItemTitle = itemView.findViewById(R.id.txt_item_title);
mTxtItemContent = itemView.findViewById(R.id.txt_item_content);
}
}
/**
* 設定點選事件
* @param holder
*/
public void setUIEvent(final CustomViewHolder holder){
//點選事假,首先判斷是否為空,不為空的時候再進行操作
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int layoutPosition = holder.getLayoutPosition();
mOnItemClickListener.OnItemClick(holder.itemView, layoutPosition);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
int layoutPosition = holder.getLayoutPosition();
mOnItemClickListener.OnItemLongClick(holder.itemView, layoutPosition);
return false;
}
});
}
}
/**
* 提供給Activity或者Fragment調用的
*
* @param onItemClickListener
*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
}
}
在擴充卡裡面對接口的調用已經很清晰明了了,相信各位看官已經看懂了吧。
再次
- 當然,現在就是在Activity裡面怎麼實作接口回調了
public class ThirdActivity extends BaseActivity implements OnItemClickListener{ RecyclerView mRecyclerView; List<CustomBean>mList=new ArrayList<>(); CustomAdapter mAdapter; @Override public void setContentView() { setContentView(R.layout.activity_third); } @Override public void initView() { mRecyclerView = $(R.id.recyclerView); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mAdapter= new CustomAdapter(mList,this); mAdapter.setOnItemClickListener(this); mRecyclerView.setAdapter(mAdapter); } @Override public void initData() { } @Override public void initClick(View view) { } @Override public void setListener() { } @Override public void OnItemClick(View view, int position) { ToastUtils.showMessage(this,getResources().getString(R.string.click_item)); } @Override public void OnItemLongClick(View view, int position) { } }
- 到此,自定義接口形成了一個圓滿的回調,當然還有其他回調寫法,再舉一個例子講解一下。依然是在擴充卡中實作
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuI2NiZDOxETN4kjYhVTMwADM2MGMwEWY5ATYwImZ5QGMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
擴充卡圖.png
- 來看圖,這個就是上面實作的擴充卡圖檔,然後我們想對内容這個字段加上點選事件該怎麼做呢?相信聰明如你的看官已經想到了。即對内容這個TextView加上點選事件即可,話不多說上代碼:
/** * 點選内容的接口 */ public interface OnItemContentClickListener{ //點選事件 void OnContentClick(int position); //長按事件 void OnContentLongClick(int position); }
- 由上面的接口可以看到此接口主要實作了點選内容區域擷取内容對應的位置的資料(然後實作跳轉功能即可)
/** * 點選内容那個TextView對應的調用 * @param onContentListener */ public void setOnContentListener(OnItemContentClickListener onContentListener){ this.mOnItemContentClickListener=onContentListener; }
- 最後在Activity中進行調用了
mAdapter.setOnContentListener(new CustomAdapter.OnItemContentClickListener() { @Override public void OnContentClick(int position) { ToastUtils.showMessage(ThirdActivity.this, getResources().getString(R.string.click_item_content)); } @Override public void OnContentLongClick(int position) { } });
- 可以看到這裡是采用匿名内部來的方式來實作的,這樣寫可以更直覺一點,但是看着比較亂一點(仁者見仁,智者見智)
最後
- 當然,自定義接口還有很多寫法,還需要大家去探索,我這裡隻是抛磚引玉。
- 針對自定義接口今天就講到這裡,希望對大家有所幫助,如果有哪裡講的不到位的地方,還請大家見諒,并且告訴我一聲,謝謝。