經常使用包 http://square.github.io/ EventBus Scroller 滾動 拖拽 # android.support.design.widget.CollapsingToolbarLayout 收縮頂部TAB(名片) # android.support.design.widget.NavigationView 左邊通欄彈出 # android.support.design.widget.TextInputLayout 帶提示輸入佈局 # android.support.design.widget.TabLayout 頂部tab # android.support.v4.widget.NestedScrollView 帶緩動的滾動 # android.support.v7.widget.CardView 卡片視圖 compile 'de.hdodenhof:circleimageview:1.3.0' 圓角圖片 compile 'com.loopj.android:android-async-http:1.4.7' 實現相似JQ AJAX compile 'com.nineoldandroids:library:2.4.0' 動畫庫 AccessibilityDelegateCompat 無障礙使用 ActionBar //設置頂部背景 actionBar.setBackgroundDrawable(getDrawable(R.drawable.aa)); //添加自定義視圖 actionBar.setDisplayShowCustomEnabled(true); actionBar.setCustomView(R.layout.nemu1); //顯示返回首頁ICON actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeActionContentDescription("ccccccccccc"); actionBar.setHomeAsUpIndicator(R.drawable.c); actionBar.setIcon(R.drawable.c); actionBar.setLogo(R.drawable.aa); //顯示ICON 或LOGO actionBar.setDisplayShowHomeEnabled(true); //爲真現實LOGO 假顯示 ICON actionBar.setDisplayUseLogoEnabled(true); actionBar.setTitle("ccccccccc"); actionBar.setSubtitle("subcccccccccc"); //是否顯示標題 actionBar.setDisplayShowTitleEnabled(true); //設置按鈕 actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP); Toolbar 跟ActionBar 相似 XML: <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_height="?attr/actionBarSize" android:layout_width="match_parent" android:background="?attr/colorPrimary" /> JAVA: Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setNavigationIcon(R.drawable.aa); toolbar.setLogo(R.drawable.c); # ScrollView 滾動視圖 <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content"> <HorizontalScrollView android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="10000dp" android:height="10000dp" /> </HorizontalScrollView> </ScrollView> # TabHost 1. 靜態 主XML: <TabHost android:id="@+id/tabhost" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" > </TabWidget> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/tab1" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="林炳東" /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> TAB XML: xxx.xml <?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/xxx"> <Button style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button" android:layout_gravity="center_horizontal" /> </LinearLayout> JAVA: TabHost th=(TabHost)findViewById(R.id.tabhost); th.setup(); LayoutInflater i= LayoutInflater.from(this); i.inflate(R.layout.xxx, th.getTabContentView()); th.addTab(th.newTabSpec("tab1") .setIndicator("標籤1", null) .setContent(R.id.tab1)); th.addTab(th.newTabSpec("tab2") .setIndicator("標籤2", null) .setContent(R.id.xxx)); 動態內容: TabHost th=(TabHost)findViewById(R.id.tabHost); th.setup(); TabHost.TabSpec tabSpec = th.newTabSpec("tab1") .setIndicator("標籤1", null) .setContent(new TabHost.TabContentFactory() { @Override public View createTabContent(String tag) { TextView text = new TextView(tabactivity.this); text.setText("text1"); return text; } }); th.addTab(tabSpec); tabSpec = th.newTabSpec("tab2") .setIndicator("標籤2", null) .setContent(new TabHost.TabContentFactory() { @Override public View createTabContent(String tag) { TextView text = new TextView(tabactivity.this); text.setText("text2"); return text; } }); th.addTab(tabSpec); # ViewStub 延時加載視圖 <ViewStub android:id="@+id/rload" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout="@layout/xxx" /> ViewStub vs = (ViewStub) findViewById(R.id.rload); vs.inflate(); # ImageSwitcher [相似 ViewSwitcher TextSwitcher] XML: <ImageSwitcher android:id="@+id/imageSwitcher" android:layout_marginTop="5dp" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" > </ImageSwitcher> <Button android:id="@+id/change" android:text="change" android:layout_marginLeft="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content" ></Button> JAVA: private Integer[] mImageIds = { R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a4}; private int i=0; private float offp=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tab); final ImageSwitcher img = (ImageSwitcher) findViewById(R.id.imageSwitcher); //顯示VIEW img.setFactory(new ViewSwitcher.ViewFactory() { @Override public View makeView() { ImageView i = new ImageView(tabactivity.this); i.setBackgroundColor(0xFF000000); i.setScaleType(ImageView.ScaleType.FIT_CENTER); i.setLayoutParams(new ImageSwitcher.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); return i; } }); img.setImageDrawable(getDrawable(mImageIds[2])); img.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { //getRawX()和getRawY()得到的是相對屏幕的位置 //getX()和getY()得到的永遠是相對view的觸摸位置座標 //返回 false 將不會觸發其餘事件 Log.i("MontionEvent",String.valueOf(event.getAction())); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: offp = event.getX(); break; case MotionEvent.ACTION_MOVE: // img.setLeft(-(int)(offp - event.getX())); break; case MotionEvent.ACTION_UP: if (offp - event.getX() > 10) { i--; img.setInAnimation(AnimationUtils .loadAnimation(tabactivity.this, R.anim.slide_in_right)); img.setOutAnimation(AnimationUtils .loadAnimation(tabactivity.this, R.anim.slide_out_left)); } else if (offp - event.getX() < 10) { i++; img.setInAnimation(AnimationUtils.loadAnimation(tabactivity.this, android.R.anim.slide_in_left)); img.setOutAnimation(AnimationUtils.loadAnimation(tabactivity.this, android.R.anim.slide_out_right)); }else return true; if (i < 0) i = mImageIds.length; img.setImageDrawable(getDrawable(mImageIds[i % mImageIds.length])); break; } return true; } }); Button but = (Button) findViewById(R.id.change); but.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { i++; img.setInAnimation(AnimationUtils.loadAnimation(tabactivity.this, android.R.anim.slide_in_left)); img.setOutAnimation(AnimationUtils.loadAnimation(tabactivity.this, android.R.anim.slide_out_right)); img.setImageDrawable(getDrawable(mImageIds[i % mImageIds.length])); } }); } # ViewFlipper 帶自動播放的 ViewSwitcher XML : <ViewFlipper android:layout_width="match_parent" android:layout_height="100dp" android:id="@+id/filp"> <!-- 第一個頁面 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/a1" /> </LinearLayout> <!-- 第二個頁面 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/a2" android:gravity="center" /> </LinearLayout> <!-- 第三個頁面 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/a3" android:gravity="center" /> </LinearLayout> <!-- 第四個頁面 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/a4" android:gravity="center" /> </LinearLayout> </ViewFlipper> <Button android:id="@+id/fc" android:text="change" android:layout_marginLeft="30dp" android:layout_width="wrap_content" android:layout_height="wrap_content" ></Button> JAVA: final ViewFlipper viewFlipper = (ViewFlipper) findViewById(R.id.filp); viewFlipper.setInAnimation(AnimationUtils.loadAnimation(tabactivity.this, android.R.anim.slide_in_left)); viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(tabactivity.this, android.R.anim.slide_out_right)); Button fc = (Button) findViewById(R.id.fc); fc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(viewFlipper.isFlipping()) viewFlipper.stopFlipping(); else viewFlipper.startFlipping(); } }); viewFlipper.startFlipping(); #AndroidImageSlider 幻燈片 https://github.com/daimajia/AndroidImageSlider compile 'com.squareup.picasso:picasso:2.3.2' compile 'com.nineoldandroids:library:2.4.0' compile 'com.daimajia.slider:library:1.1.5@aar' # ViewPager 左右滾動頁面 XML: <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="1000dp" android:id="@+id/viewpager"> <!-- PagerTabStrip 標題底部線 --> <android.support.v4.view.PagerTabStrip android:id="@+id/tabstrip" android:layout_width="wrap_content" android:layout_height="50dip" android:gravity="center" /> </android.support.v4.view.ViewPager> JAVA: ViewPager pager = null; PagerTabStrip tabStrip = null; ArrayList<View> viewContainter = new ArrayList<View>(); ArrayList<String> titleContainer = new ArrayList<String>(); public String TAG = "tag"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tab); pager = (ViewPager) this.findViewById(R.id.viewpager); tabStrip = (PagerTabStrip) this.findViewById(R.id.tabstrip); //取消tab下面的長橫線 //tabStrip.setDrawFullUnderline(false); //設置當前tab頁籤的下劃線顏色 tabStrip.setTabIndicatorColor(this.getResources().getColor(android.R.color.holo_blue_bright)); tabStrip.setTextSpacing(200); View view1 = LayoutInflater.from(this).inflate(R.layout.xxx, null); View view2 = LayoutInflater.from(this).inflate(R.layout.xxx, null); //viewpager開始添加view viewContainter.add(view1); viewContainter.add(view2); //頁籤項 titleContainer.add("網易新聞"); titleContainer.add("網易體育"); pager.setAdapter(new PagerAdapter() { @Override public int getCount() { return viewContainter.size(); } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager) container).removeView(viewContainter.get(position)); } //每次滑動的時候生成的組件 @Override public Object instantiateItem(ViewGroup container, int position) { ((ViewPager) container).addView(viewContainter.get(position)); return viewContainter.get(position); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public int getItemPosition(Object object) { return super.getItemPosition(object); } @Override public CharSequence getPageTitle(int position) { return titleContainer.get(position); } }); pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); } 配合 Fragment 使用 XML: <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="1000dp" android:id="@+id/viewPager"> <android.support.v4.view.PagerTabStrip android:id="@+id/tabstrip" android:layout_width="wrap_content" android:layout_height="50dip" android:gravity="center" /> </android.support.v4.view.ViewPager> JAVA: List<Fragment> fragmentList = new ArrayList<Fragment>(); List<String> titleList = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tab); ViewPager vp = (ViewPager)findViewById(R.id.viewPager); fragmentList.add(new ViewPagerFragment1("頁面1")); fragmentList.add(new ViewPagerFragment1("頁面2")); fragmentList.add(new ViewPagerFragment1("頁面3")); titleList.add("title 1 "); titleList.add("title 2 "); titleList.add("title 3 "); vp.setAdapter(new myPagerAdapter(getSupportFragmentManager(), fragmentList, titleList)); } class myPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList; private List<String> titleList; public myPagerAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList){ super(fm); this.fragmentList = fragmentList; this.titleList = titleList; } @Override public Fragment getItem(int arg0) { return (fragmentList == null || fragmentList.size() == 0) ? null : fragmentList.get(arg0); } @Override public CharSequence getPageTitle(int position) { return (titleList.size() > position) ? titleList.get(position) : ""; } @Override public int getCount() { return fragmentList == null ? 0 : fragmentList.size(); } } public class ViewPagerFragment1 extends Fragment { public ViewPagerFragment1(String text){ super(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.xxx, container, false); return v; } } # SwipeRefreshLayout 下拉刷新 ITEM XML: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/img" android:layout_width="100dp" android:layout_height="wrap_content" fresco:placeholderImage="@drawable/aa" fresco:viewAspectRatio="2" fresco:roundedCornerRadius="10dp" /> <TextView android:id="@+id/txt" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> XML <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height="match_parent" > <!--不用ScrollView 會致使加載圖標被覆蓋--> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:paddingTop="10dp" android:text="zzzzzzzzz" android:textSize="20sp" android:textStyle="bold" /> </ScrollView> </android.support.v4.widget.SwipeRefreshLayout> <TextView android:visibility="gone" android:id="@+id/empty_list" android:layout_width="match_parent" android:layout_height="match_parent" android:text="No items." android:gravity="center"/> JAVA: final SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.swipe_container); //設置刷新時動畫的顏色,能夠設置4個 swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { Log.i("SwipeRefreshLayout","REFRESH"); new Handler().postDelayed(new Runnable() { @Override public void run() { Log.i("SwipeRefreshLayout", "REFRESH OK"); swipeRefreshLayout.setRefreshing(false); } }, 6000); } }); swipeRefreshLayout.setEmptyView(findViewById(R.id.empty_list)); 帶上拉加載的 SwipeRefreshLayout compile 'com.demievil.library:refreshlayout:1.0.0@aar' XML: <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.demievil.library.RefreshLayout android:id="@+id/my" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" tools:listitem="@layout/item" /> </com.demievil.library.RefreshLayout> <TextView android:visibility="gone" android:id="@+id/empty_list" android:layout_width="match_parent" android:layout_height="match_parent" android:text="No items." android:gravity="center" android:textColor="@color/colorPrimary"/> </RelativeLayout> JAVA: public class MainActivity extends AppCompatActivity { RefreshLayout mRefreshLayout; ListView mListView; View footerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRefreshLayout = (RefreshLayout) findViewById(R.id.my); mListView = (ListView) findViewById(R.id.list); footerLayout = getLayoutInflater().inflate(R.layout.listview_footer, null); mListView.setEmptyView(findViewById(R.id.empty_list)); mListView.addFooterView(footerLayout); mRefreshLayout.setChildView(mListView); final ArrayAdapter apt= new myapt(this,R.layout.item);; mListView.setAdapter(apt); final LoaderManager.LoaderCallbacks loadercallback = new LoaderManager.LoaderCallbacks<List<Map<String,String>>>(){ @Override public Loader<List<Map<String,String>>> onCreateLoader(int id, Bundle args) { return new myloader(MainActivity.this,args); } @Override public void onLoadFinished(Loader<List<Map<String,String>>> loader, List<Map<String,String>> data) { apt.addAll(data); mRefreshLayout.setRefreshing(false); mRefreshLayout.setLoading(false); } @Override public void onLoaderReset(Loader<List<Map<String,String>>> loader) { apt.clear(); } }; mRefreshLayout.setOnRefreshListener(new RefreshLayout.OnRefreshListener() { @Override public void onRefresh() { // start to refresh getLoaderManager().destroyLoader(1); Bundle b = new Bundle(); b.putString("page","1"); getLoaderManager().initLoader(1, b, loadercallback); } }); mRefreshLayout.setOnLoadListener(new RefreshLayout.OnLoadListener() { @Override public void onLoad() { Bundle b = new Bundle(); b.putString("page","2"); getLoaderManager().restartLoader(1,b,loadercallback); } }); Bundle b = new Bundle(); b.putString("page","1"); getLoaderManager().initLoader(1, b,loadercallback); } static class myloader extends AsyncTaskLoader<List<Map<String,String>>> { Bundle args; public myloader(Context context, Bundle args) { super(context); this.args=args; } Call call = null; @Override public List<Map<String,String>> loadInBackground() { List<Map<String,String>> my= new ArrayList<Map<String,String>>(); OkHttpClient client= new OkHttpClient(); String url="http://wifiad-api.urltest.tk/index/test"; Request request = new Request.Builder().url(url).build(); Response response = null; String c = null; try { call=client.newCall(request); response = call.execute(); c = response.body().string(); } catch (Exception e) { e.printStackTrace(); return my; } if(!response.isSuccessful()){ return my; } JSONTokener jsontoken= new JSONTokener(c); JSONObject jsonobject = null; JSONArray jsonarr; try { jsonobject = (JSONObject) jsontoken.nextValue(); jsonarr =jsonobject.getJSONArray("data"); for (int i=0;i<jsonarr.length();i++){ JSONObject t=(JSONObject)jsonarr.get(i); Map<String,String> m1= new HashMap<String,String>(); m1.put("txt",t.getString("tit").toString()); m1.put("pic",t.getString("src").toString()); my.add(m1); } } catch (JSONException e) { e.printStackTrace(); return my; } return my; } @Override public void cancelLoadInBackground() { call.cancel(); } @Override protected void onStartLoading() { forceLoad(); } @Override protected void onStopLoading() { cancelLoad(); } @Override protected void onReset() { super.onReset(); onStopLoading(); } } class myapt extends ArrayAdapter<Map<String,String>>{ int resource; public myapt(Context context, int resource) { super(context, resource); this.resource=resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view; LayoutInflater inflater = getLayoutInflater(); if (convertView == null) { view = inflater.inflate(resource, parent, false); } else { view = convertView; } Map<String,String> data = getItem(position); String c =data.get("pic"); if(c!=null) { Uri uri = Uri.parse(c); SimpleDraweeView draweeView = (SimpleDraweeView) view.findViewById(R.id.img); draweeView.setImageURI(uri); } TextView viewById = (TextView) view.findViewById(R.id.txt); viewById.setText(data.get("txt")); return view; } } } 數據綁定: ITEM XML: <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto" > <data class=".Userlist"> <import type="android.view.View" /> <import type="com.example.mode.User" alias="User" /> <variable name="handlers" type="com.example.work.dome1.Main2Activity"/> <variable name="user" type="User"/> <import type="android.databinding.ObservableMap"/> <variable name="prs" type="ObservableMap<String, Object>"/> </data> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="50dp" android:layout_height="100dp" android:text='@{prs["index"], default="5"}' android:gravity="center" android:paddingLeft="10dp" android:paddingRight="10dp" android:id="@+id/index" /> <com.facebook.drawee.view.SimpleDraweeView app:imageUrl="@{user.src}" android:id="@+id/img" android:layout_width="100dp" android:layout_height="wrap_content" fresco:placeholderImage="@drawable/aa" fresco:viewAspectRatio="2" fresco:roundedCornerRadius="10dp" /> <TextView android:onClick="@{handlers.onClickFriend}" android:layout_width="wrap_content" android:layout_height="100dp" android:id="@+id/t1" android:text="@{user.tit}" android:gravity="center" android:paddingLeft="10dp" android:paddingRight="10dp" /> </LinearLayout> </layout> XML: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.work.dome1.Main2Activity"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/main2" android:layout_alignParentTop="true" android:layout_alignParentStart="true" /> <TextView android:visibility="gone" android:id="@+id/empty_list" android:layout_width="match_parent" android:layout_height="100dp" android:text="No items." android:gravity="center" android:textColor="@color/colorPrimary"/> </RelativeLayout> USER JAVA: public class User extends BaseObservable { private String tit; private String src; @Bindable public String getTit() { return tit; } public void setTit(String tit){ this.tit=tit; notifyPropertyChanged(BR.tit); } @Bindable public String getSrc(){ return src; } public void setSrc(String src){ this.src=src; notifyPropertyChanged(BR.src); } @BindingAdapter({"bind:imageUrl"}) public static void loadImage(SimpleDraweeView view, String url) { Uri uri = Uri.parse(url); view.setImageURI(uri); } } JAVA: public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); ListView mlv = (ListView) findViewById(R.id.main2); mlv.setEmptyView(findViewById(R.id.empty_list)); myapt myapt = new myapt(this, R.layout.main2); mlv.setAdapter(myapt); ProgressDialog dialog = new ProgressDialog(this); myasync myasync = new myasync(myapt, dialog); myasync.execute("page=1"); } public void onClickFriend(View view) { Log.i("xxx","bbb"); } class myasync extends AsyncTask<String,Integer,ArrayList<User>>{ ProgressDialog dialog=null; ArrayAdapter<User> apt; public myasync(ArrayAdapter<User> apt,ProgressDialog dialog){ this.dialog=dialog; this.apt=apt; } @Override protected ArrayList<User> doInBackground(String... params) { ArrayList<User> my= new ArrayList<User>(); OkHttpClient client= new OkHttpClient(); String url="http://wifiad-api.urltest.tk/index/test"; Request request = new Request.Builder().url(url).build(); Response response = null; String c = null; try { Call call=client.newCall(request); response = call.execute(); c = response.body().string(); } catch (Exception e) { e.printStackTrace(); return my; } if(!response.isSuccessful()){ return my; } JSONTokener jsontoken= new JSONTokener(c); JSONObject jsonobject = null; JSONArray jsonarr; try { jsonobject = (JSONObject) jsontoken.nextValue(); jsonarr =jsonobject.getJSONArray("data"); for (int i=0;i<jsonarr.length();i++){ JSONObject t=(JSONObject)jsonarr.get(i); User u= new User(); u.setTit(t.getString("tit").toString()); u.setSrc(t.getString("src").toString()); my.add(u); } } catch (JSONException e) { e.printStackTrace(); return my; } return my; } @Override protected void onPreExecute() { if(dialog!=null) { dialog.setMessage("加載中"); dialog.show(); } super.onPreExecute(); } @Override protected void onPostExecute(ArrayList<User> s) { if(dialog!=null) dialog.hide(); super.onPostExecute(s); apt.addAll(s); } } class myapt extends ArrayAdapter<User>{ int resource; public myapt(Context context, int resource) { super(context, resource); this.resource=resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view; LayoutInflater inflater = getLayoutInflater(); com.example.work.dome1.Userlist binding; binding= DataBindingUtil.inflate(inflater,resource,parent,false); ObservableArrayMap<String, Object> prs = new ObservableArrayMap<>(); binding.setPrs(prs); User data = getItem(position); binding.setUser(data); return binding.getRoot(); } } } RecyclerView 列表 compile 'com.android.support:recyclerview-v7:23.1.1' ITEM XML: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="80dp" android:text="New Text" android:id="@+id/tt1" android:gravity="center" /> </LinearLayout> MENU XML: <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/add" android:orderInCategory="100" app:showAsAction="never" android:title="添加" /> <item android:id="@+id/del" android:orderInCategory="100" app:showAsAction="ifRoom" android:title="刪除" /> </menu> XML: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.work.dome1.Main3Activity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view_test_rv" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> JAVA: public class Main3Activity extends AppCompatActivity { PersonAdapter mylist; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_test_rv); //設置動畫 recyclerView.setItemAnimator(new DefaultItemAnimator()); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); //設置佈局 recyclerView.setLayoutManager(layoutManager); ArrayList<String> list = new ArrayList<>(); for (int i=0;i<100;i++){ list.add("itemsss"+String.valueOf(i)); } mylist = new PersonAdapter(list); recyclerView.setAdapter(mylist); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.my,menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.add: mylist.add(1,"new text"); break; case R.id.del: mylist.del(0); break; } return super.onOptionsItemSelected(item); } public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.PersonViewHolder> { private List<String> list; public PersonAdapter(List<String> list) { this.list = list; } public void add(int position,String listitem) { list.add(position, listitem); notifyItemInserted(position); } public void del(int position) { list.remove(position); notifyItemRemoved(position); } @Override public PersonAdapter.PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //建立視圖 View view = getLayoutInflater().inflate(R.layout.citem, parent, false); return new PersonViewHolder(view); } @Override public void onBindViewHolder(PersonAdapter.PersonViewHolder viewHolder, int i) { //把數據綁定到視圖 PersonViewHolder holder = viewHolder; String person = list.get(i); holder.set_txt(person); } @Override public int getItemCount() { return list.size(); } class PersonViewHolder extends RecyclerView.ViewHolder { public PersonViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("xxx", "xxx"); } }); } public void set_txt(String a){ TextView t1 = (TextView) itemView.findViewById(R.id.tt1); t1.setText(a); } } } } 基於 RecyclerView 的上下拉 compile 'com.github.tosslife:pullloadview:1.1.0' SlidingPaneLayout 左右面板 [右邊移動] XML: <android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/slidingpanellayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <fragment android:id="@+id/leftfragment" android:name="com.example.dome2.tabactivity$BookMarkerFragment" android:layout_width="100dp" android:layout_height="match_parent" android:layout_gravity="left" /> <fragment android:id="@+id/rightfragment" android:name="com.example.dome2.tabactivity$BookMarkerFragment2" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="right" android:layout_weight="1" /> </android.support.v4.widget.SlidingPaneLayout> JAVA: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tab); SlidingPaneLayout spl = (SlidingPaneLayout) this.findViewById(R.id.slidingpanellayout); spl.setPanelSlideListener(new SlidingPaneLayout.PanelSlideListener() { @Override public void onPanelClosed(View view) { //面板打開 } @Override public void onPanelOpened(View viw) { //面板關閉 } @Override public void onPanelSlide(View arg0, float arg1) { } }); } public static class BookMarkerFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.xxx, container, false); return view; } } public static class BookMarkerFragment2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.xxx, container, false); return view; } } DrawerLayout 左右面板 [右邊固定] XML: <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- The main content view --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="open" /> </FrameLayout> <!-- The navigation drawer --> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </android.support.v4.widget.DrawerLayout> JAVA: final DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); Button button = (Button) findViewById(R.id.btn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 按鈕按下,將抽屜打開 mDrawerLayout.openDrawer(Gravity.LEFT); } }); FrameLayout 層疊顯示 LinearLayout 線性排列 TableLayout TableRow 表格排列 GridLayout 格子 RelativeLayout 相對排列 只針對下級(一級)子元素有效 //相對同級視圖 (值:視圖ID) layout_below 放到指定視圖下面 layout_above 放到指定視圖上面 layout_toLeftOf 放到指定視圖左邊 layout_toRightOf 放到指定視圖右邊 layout_alignTop 頂邊與指定視圖頂邊對齊 layout_alignBottom 低邊與指定視圖低邊對齊 layout_alignLeft 左邊與指定視圖左邊對齊 layout_alignRight 右邊與指定視圖右邊對齊 layout_alignBaseline 與指定視圖基準線對齊 (如保持文字在同行) //相對父視圖 (值:true false) layout_alignParentTop 頂邊與其父視圖的頂邊對齊 layout_alignParentBottom 底邊與其父視圖的底邊對齊 layout_alignParentLeft 左邊與其父視圖的左邊對齊 layout_alignParentRight 右邊與其父視圖的右邊對齊 layout_centerHorizontal 在父視圖中水平居中 layout_centerVertical 在父視圖中垂直居中 layout_centerInParent 在父視圖中的中央 LinearLayoutCompat 線性佈局 每一個組件間加 divider XML: <android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="20dip" android:orientation="vertical" app:divider="@drawable/line" app:dividerPadding="5dp" app:showDividers="beginning|middle|end" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="CSDN Zhang Phil" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="CSDN Zhang Phil" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="CSDN Zhang Phil" /> </android.support.v7.widget.LinearLayoutCompat>