Demo使用ListView作为整体Demo列表,罗列出整个demo的效果,点击每一个列表项,便可启动对应的Demo效果。
Demo的亮点是作者使用jdk1.5提供的枚举特性实现了对ListView的列表项内容的填充,在此处作者定义了一个包含两个属性的枚举类。
public enum Demo {
. . .
public final int titleResId;
public final int layoutResId;
Demo(int titleResId, int layoutResId) {
this .titleResId = titleResId;
this .layoutResId = layoutResId;
}
. . .
}
作者在此处使用该枚举方式处理不同demo效果和标题不同的问题。在定义枚举时传递标题和内容布局的资源id,如下所示:
BASIC(R.string .demo _title_basic, R.layout .demo _basic),
在ListView的item点击监听部分,作者利用了枚举和ListView里面Item都是从0位置开始的特性,并且在枚举中定义了启动对应activity的方法,聪明的解决了启动不同activity的繁琐,大大减少了代码量。如下所示:
MainActivitiy中:
利用每一个枚举对象都是一个单独的枚举实例这一个特性来通过不同的枚举启动对应的实例
@Override
public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
Demo demo = Demo.values()[position];
demo.startActivity(this );
}
Demo枚举中:
每个枚举实例会调用该方法将自身实例传递进去,该自身实例包括了Demo的标题和Demo的布局。
调用DemoActivitiy的startActivity方法来启动展示Demo的Activity实例。每个实例都会获得对应标题和内容布局的枚举实例。
public void startActivity (Context context) {
DemoActivity.startActivity(context, this );
}
在承载Demo的Activity中:
每次调用该方法,都会启动一个同一个Activity的新的实例,因为每次传递的枚举实例的内容不同,因此就可以在每次启动的时候通过布局加载器,加载不同的Demo内容。在Intent中,将枚举实例的名称传递进去。在新启动的activity中可以通过该枚举名称获取对应的布局,同时该枚举名称亦可以作为新Activity实例的标题。
public static void startActivity (Context context, Demo demo) {
Intent intent = new Intent(context, DemoActivity.class);
intent.putExtra(KEY_DEMO, demo.name());
context.startActivity(intent);
}
在承载Demo的Activity中:
通过布局加载器加载对应枚举实例指向的布局,将其添加进对应的tab容器中,起到展示不同Demo效果的作用。
Demo demo = getDemo()
ViewGroup tab = (ViewGroup) findViewById(R.id .tab )
tab.addView (LayoutInflater.from (this).inflate (demo.layoutResId , tab, false))
private Demo getDemo() {
return Demo.valueOf (getIntent().getStringExtra (KEY_DEMO))
}
如此,经过对枚举特性的充分使用,整个Demo的代码变得简单,同时却又尽显高手对程序结构设计功底。
完整样例代码:
枚举:Demo
package com .example .listview .demo
import android.content .Context
import android.content .res .Resources
import android.support .v 4.view .PagerAdapter
import android.view .LayoutInflater
import android.view .View
import android.view .ViewGroup
import android.widget .ImageView
import com .example .listview .R
import com .example .listview .SmartTabLayout
public enum Demo {
BASIC(R.string .demo _title_basic, R.layout .demo _basic),
SMART_INDICATOR(R.string .demo _title_smart_indicator, R.layout .demo _smart_indicator),
DISTRIBUTE_EVENLY(R.string .demo _title_distribute_evenly, R.layout .demo _distribute_evenly) {
@Override
public int[] tabs() {
return tab3()
}
},
ALWAYS_IN_CENTER(R.string .demo _title_always_in_center, R.layout .demo _always_in_center),
CUSTOM_TAB(R.string .demo _title_custom_tab_text, R.layout .demo _custom_tab_text),
CUSTOM_TAB_COLORS(R.string .demo _title_custom_tab_colors, R.layout .demo _custom_tab_colors),
CUSTOM_TAB_ICONS(R.string .demo _title_custom_tab_icons, R.layout .demo _custom_tab_icons) {
@Override
public int[] tabs() {
return new int[] {
R.string .demo _tab_no_title,
R.string .demo _tab_no_title,
R.string .demo _tab_no_title,
R.string .demo _tab_no_title
}
}
@Override
public void setup(SmartTabLayout layout) {
super.setup (layout)
final LayoutInflater inflater = LayoutInflater.from (layout.getContext ())
final Resources res = layout.getContext ().getResources ()
layout.setCustomTabView (new SmartTabLayout.TabProvider () {
@Override
public View createTabView(ViewGroup container, int position, PagerAdapter adapter) {
ImageView icon = (ImageView) inflater.inflate (R.layout .custom _tab_icon, container, false)
switch (position) {
case 0 :
icon.setImageDrawable (res.getDrawable (R.drawable .ic _home_white_24dp))
break
case 1 :
icon.setImageDrawable (res.getDrawable (R.drawable .ic _search_white_24dp))
break
case 2 :
icon.setImageDrawable (res.getDrawable (R.drawable .ic _person_white_24dp))
break
case 3 :
icon.setImageDrawable (res.getDrawable (R.drawable .ic _flash_on_white_24dp))
break
default:
throw new IllegalStateException("Invalid position: " + position)
}
return icon
}
})
}
},
INDICATOR_TRICK1(R.string .demo _title_indicator_trick1, R.layout .demo _indicator_trick1),
INDICATOR_TRICK2(R.string .demo _title_indicator_trick2, R.layout .demo _indicator_trick2)
public final int titleResId
public final int layoutResId
Demo(int titleResId, int layoutResId) {
this.titleResId = titleResId
this.layoutResId = layoutResId
}
public void startActivity(Context context) {
DemoActivity.startActivity (context, this)
}
public void setup(final SmartTabLayout layout) {
//Do nothing.
}
public int[] tabs() {
return tab10()
}
public static int[] tab10() {
return new int[]{
R.string .demo _tab_1,
R.string .demo _tab_2,
R.string .demo _tab_3,
R.string .demo _tab_4,
R.string .demo _tab_5,
R.string .demo _tab_6,
R.string .demo _tab_7,
R.string .demo _tab_8,
R.string .demo _tab_9,
R.string .demo _tab_10
}
}
public static int[] tab3() {
return new int[]{
R.string .demo _tab_8,
R.string .demo _tab_9,
R.string .demo _tab_10
}
}
}
MainActivity:
package com.example.listview.demo;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.example.listview.R;
public class MainActivity extends ActionBarActivity implements AbsListView .OnItemClickListener {
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.list);
listView.setOnItemClickListener(this );
ArrayAdapter<String> demoAdapter = new ArrayAdapter<String>(this ,
android.R.layout.simple_list_item_1);
for (Demo demo : Demo.values()) {
demoAdapter.add(getString(demo.titleResId));
}
listView.setAdapter(demoAdapter);
}
@Override
public boolean onCreateOptionsMenu (Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super .onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected (MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_github:
openGitHub();
return true ;
default :
return super .onOptionsItemSelected(item);
}
}
@Override
public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
Demo demo = Demo.values()[position];
demo.startActivity(this );
}
private void openGitHub () {
Uri uri = Uri.parse(getString(R.string.app_github_url));
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
DemoActivity:
package com .example .listview .demo
import android.content .Context
import android.content .Intent
import android.os .Bundle
import android.support .v 4.view .ViewPager
import android.support .v 7.app .ActionBarActivity
import android.support .v 7.widget .Toolbar
import android.view .LayoutInflater
import android.view .ViewGroup
import com .example .listview .R
import com .example .listview .SmartTabLayout
import com .example .listview .utils _v4.v 4.FragmentPagerItem
import com .example .listview .utils _v4.v 4.FragmentPagerItemAdapter
import com .example .listview .utils _v4.v 4.FragmentPagerItems
public class DemoActivity extends ActionBarActivity {
private static final String KEY_DEMO = "demo"
public static void startActivity(Context context, Demo demo) {
Intent intent = new Intent(context, DemoActivity.class )
intent.putExtra (KEY_DEMO, demo.name ())
context.startActivity (intent)
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState)
setContentView(R.layout .activity _demo)
Demo demo = getDemo()
Toolbar toolbar = (Toolbar) findViewById(R.id .toolbar )
toolbar.setTitle (demo.titleResId )
setSupportActionBar(toolbar)
getSupportActionBar().setDisplayHomeAsUpEnabled (true)
ViewGroup tab = (ViewGroup) findViewById(R.id .tab )
tab.addView (LayoutInflater.from (this).inflate (demo.layoutResId , tab, false))
ViewPager viewPager = (ViewPager) findViewById(R.id .viewpager )
SmartTabLayout viewPagerTab = (SmartTabLayout) findViewById(R.id .viewpagertab )
demo.setup (viewPagerTab)
FragmentPagerItems pages = new FragmentPagerItems(this)
for (int titleResId : demo.tabs ()) {
pages.add (FragmentPagerItem.of (getString(titleResId), DemoFragment.class ))
}
FragmentPagerItemAdapter adapter = new FragmentPagerItemAdapter(
getSupportFragmentManager(), pages)
viewPager.setAdapter (adapter)
viewPagerTab.setViewPager (viewPager)
}
private Demo getDemo() {
return Demo.valueOf (getIntent().getStringExtra (KEY_DEMO))
}
}