自定義公用Adapter介面卡--回撥機制
阿新 • • 發佈:2018-12-12
1.回撥:我的理解是,一個類A實現一個介面CallBack(該介面可以是B類的內部介面,也可以是獨立的介面),類A包含類B的引用b,類B有引數為callBack的方法或建構函式,最後類A呼叫B中的方法或建構函式,當類B觸發某事件即可呼叫類A中CallBack的方法,最後將操作結果返回給類A,此為回撥。
2.例子:自定義公用Adapter介面卡
(1)類A:LActivity
public class LActivity extends BaseActivity implements View.OnClickListener,LAdepter.LCallBack{ Context mContext; private ListView listView; private LAdepter lAdepter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list_item_lenita_item); //layout,其包含一個ListView initData(); } private void initData(){ mContext = this; String[] s = new String[3]; s[0] = "first line"; s[1] = "second line"; s[2] = "third line"; lAdepter = new LAdepter(mContext,LActivity.this,s); listView = (ListView)findViewById(R.id.lv_lenita); //ListView listView.setAdapter(lAdepter); } @Override public void onClick(View view) { } @Override public ComponentName getBroadcastComponent() { return getComponentName(); } @Override public void answer(String str) { LogUtil.log("test","call back answer = "+ str); //具體的返回內容看類B給什麼String } }
public class LAdepter extends BaseAdapter { LCallBack lCallBack; private String[] strings; private Context mContext; public LAdepter(Context context,LCallBack lCallBack,String[] strings){ this.lCallBack = lCallBack; this.strings = strings; mContext = context; } @Override public int getCount() { return strings.length; } @Override public String getItem(int i) { return strings[i]; } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if(view == null){ view = LayoutInflater.from(mContext).inflate(R.layout.list_item_spinner, null); //自定義的ListView樣式 view.setTag(R.id.tv_list_item, view.findViewById(R.id.tv_list_item)); } String content = getItem(i); TextView tv_list_item = (TextView) view.getTag(R.id.tv_list_item); tv_list_item.setText(content); tv_list_item.setOnClickListener(onClickListener); //條目點選監聽 tv_list_item.setTag(i); return view; } View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View view) { int position = (int)view.getTag(); lCallBack.answer(getItem(position)); //回撥 } }; public interface LCallBack { public void answer(String str); //類B的內部介面 } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/lv_lenita" android:divider="@null"> </ListView> </LinearLayout> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/layout_city_list"> <TextView android:id="@+id/tv_list_item" android:layout_width="match_parent" android:layout_height="40dp" android:text="test" android:textSize="17.7dp" android:textColor="@color/black_word" android:gravity="center_vertical" android:paddingLeft="20dp"/> </LinearLayout>