對于剛接觸接口的我來講,真的是好難的一個東西啊,感覺不斷在追著數據跑,照著例子敲 有時還不知道敲的是什么,上網上找博客看 有個例子是打電話,那個讓我大概了解了接口,但是對于怎么寫一個接口傳值仍一頭霧水.不過什么東西敲多了就大概了解了.
我們用接口來傳值的一個很典型的例子就是RecyclerView的點擊事件.所以我們來分析一下點擊事件的書寫順序:
首先我們需要建立一個接口,如同建立一個類一樣,不過把class換為interface 接口名字其實可以隨便取(剛開始學時候以為名字改了不能用呢) 不過最好可以看出為RecyClerView的接口, 在接口里寫一個沒有方法體的方法,類似這個 ,我希望傳的是點擊的位置,也可以傳遞其他參數
public interface OnRecItemClickListener { public void onRecclick(int position);}建立完接口我們需要找到你想在什么界面或什么情況下觸發這個接口,比如這個RecyclerView 我希望在它的行布局被點擊時候觸發,那么我需要找在哪里有它的行布局,是RecyclerView的適配器在onBindViewHolder中我們看到他在對行布局的視圖進行操作,那么我們就在這里觸發接口
既然知道在那個界面有著接口的觸發條件,首先我們需要在這個界面創建一個接口對象
PRivate OnRecyclerItemClick onRecyclerItemClick; 這個接口對象需要一個賦值方法,不然會空指針(在適配器中用這個方法,假如在Fragment中想向Activity傳值需要Activity implement接口 在Fragment中用onAttach賦給接口對象值 如下 [只有依附在該activity上的fragment可以向activity傳值,若是兩者沒有關系,不要使用接口回調 ])public void setOnRecyclerItemClick(OnRecyclerItemClick onRecyclerItemClick) { this.onRecyclerItemClick = onRecyclerItemClick;}@Overridepublic void onAttach(Context context) { super.onAttach(context); this.context=context; OperateDatabase= (OperateDatabase) context;}在我們有了一個不為空的接口對象后,我們需要在行布局被點擊的事件中(系統的)來觸發我們自己寫的 如下 ,在onBindViewHolder 中holder1.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onRecyclerItemClick.onItemClick(position); }});如上,在holder中或的行布局視圖itemview ,在itemView點擊時 觸發行布局點擊并且傳值,不過這時候我們還沒有能接收對象的
不過接下來就很簡單了,我們只需要像使用其它接口時使用就行,不過因為是在adapter中觸發此事件,我們需要用adapter.setOnReclerItemClick(this),而不是像listview的點擊是listview.setOnitemClickListener 這是我們就可以操作了,我們操作的就是傳過來的position.其他接口回調的使用方法是一樣的
我們只需要找到我們想傳什么,從什么界面傳,傳到那個界面,以及在什么情況下傳 接口回調使用就不難.
就比如我們在MainActivity的ViewPager中的Fragment向MainActivity傳值 (也不一定是傳值,有時我們在fragment做了某些操作,然后希望Activity做一些操作,我們也是用接口)
比如說我在fragment中有對數據庫進行操作的按鈕,但是操作過程我們希望在MainActivity中進行,首先我們的接口(與之前的類似):
public interface OperateDatabase { void insert(); void deltete(); void query(); void update();}數據庫的四種操作,在Fragment中我們還是先定義接口對象
private OperateDatabase operateDatabase; 然后我們初始化它,代碼如下(context是Activity,因為Activity implement了這個接口,所以可以轉換)@Overridepublic void onAttach(Context context) { super.onAttach(context); this.context=context; operateDatabase= (OperateDatabase) context;} 接著我們開始找什么時候觸發接口,讓Activity中的insert 方法執行,我們在點擊按鈕時執行,所以我們寫按鈕的點擊事件,并調用接口中方法@Overridepublic void onClick(View view) { switch (view.getId()) { case R.id.add_btn: operateDatabase.insert(); break; case R.id.update_btn: operateDatabase.update(); break; case R.id.delete_btn: operateDatabase.deltete(); break; case R.id.query_btn: operateDatabase.query(); break; }} 而這個時候,我們在fragment中的操作就結束了,我們需要到Activity中進行操作首先我們implement接口
public class MainActivity extends BaseActivity implements OperateDatabase{這時就需要如同onClick時間一樣,實現方法(這個方法的名字是我們自己起的) 并且在方法中實現我們在Fragment點擊按鈕后需要Activity做的事情在這里我之前已經建立了數據庫和表,這里就進行了對數據庫的操作
@Overridepublic void insert() { ContentValues values=new ContentValues(); values.put("name","value"); db.insert("student",null,values); Log.e("66666", "insert: ");}@Overridepublic void deltete() { db.delete("student","name=?",new String[]{"values"}); Log.e("66666", "delete: ");}@Overridepublic void query() { Cursor cursor =db.query("student",null,null,null,null,null,null); if (cursor!=null) { while (cursor.moveToNext()) { String name=cursor.getString(cursor.getColumnIndex("name")); } } Log.e("66666", "query: ");}@Overridepublic void update() { ContentValues values=new ContentValues(); values.put("name","update"); db.update("student",values,"name=?",new String[]{"value"}); Log.e("66666", "update: ");}這樣fragment向Activity傳值就實現了,需要傳值就在我們定義接口時寫進去,在傳值時傳過去就好.我的這個例子沒有傳值,以下是我隨便點打的logE/66666: insert: E/66666: delete: E/66666: update: E/66666: query: E/66666: insert: E/66666: insert:
不過因為我是個初學者,對于原理什么的都不懂,所以上述所有肯定會有錯誤,so小心踩雷.
新聞熱點
疑難解答