Android 常用布局视图
常用包 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>