NavigationActivity.java
/**
* Method that initializes the navigation views of the activity
*/
private void initNavigationViews() {
//Get the navigation views (wishlist: multiple view; for now only one view)
this.mNavigationViews = new NavigationView[1];
this.mCurrentNavigationView = 0;
//- 0
this.mNavigationViews[0] = (NavigationView)findViewById(R.id.navigation_view);
this.mNavigationViews[0].setId(0);
this.mEasyModeListView = (ListView) findViewById(R.id.lv_easy_mode);
mEasyModeAdapter = new ArrayAdapter<MimeTypeCategory>(this, R.layout
.navigation_view_simple_item) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = (convertView == null) ?getLayoutInflater().inflate(R.layout
.navigation_view_simple_item, parent, false) : convertView;
MimeTypeCategory item = getItem(position);
String typeTitle = MIME_TYPE_LOCALIZED_NAMES[item.ordinal()];
TextView typeTitleTV = (TextView) convertView
.findViewById(R.id.navigation_view_item_name);
ImageView typeIconIV = (ImageView) convertView
.findViewById(R.id.navigation_view_item_icon);
View checkBoxView = convertView.findViewById(R.id.navigation_view_item_check);
checkBoxView.setVisibility(View.GONE);
typeTitleTV.setText(typeTitle);
typeIconIV.setImageDrawable(EASY_MODE_ICONS.get(item));
convertView.setOnClickListener(mEasyModeItemClickListener);
convertView.setTag(position);
return convertView;
}
};
mEasyModeAdapter.addAll(EASY_MODE_LIST);//adapter
mEasyModeListView.setAdapter(mEasyModeAdapter);
}
private static final List<MimeTypeCategory> EASY_MODE_LIST = new ArrayList<MimeTypeCategory>() {
{
add(NONE);
add(IMAGE);
add(VIDEO);
add(AUDIO);
add(DOCUMENT);
add(APP);
}
};
onOptionsItemSelected( item.getItemId() == android.R.id.home ) / onBackPressed()
back()
navigateToHistory( view.onRestoreState(info) )
NavigationView.java
NavigationView( R.styleable.Navigable )
init()
changeViewMode(
//Set the adapter
this.mAdapter = adapter;
newView.setAdapter(this.mAdapter);
newView.setOnItemClickListener(NavigationView.this);
//Add the new layout
this.mAdapterView = newView;
addView(newView, 0);
this.mCurrentMode = newMode;
)
onRestoreState()
refresh()
changeCurrentDir( mNavigationTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, newDir); )
NavigationTask //加载listview
onPreExecute()
doInBackground()
onPostExecute( onPostExecuteTask() )
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。
1) 子类化AsyncTask
2) 实现AsyncTask中定义的下面一个或几个方法
onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。
FileSystemObjectAdapter.java
getView( Drawable dwIcon = this.mIconHolder.getDrawable(
MimeTypeHelper.getIcon(getContext(), fso, true));
mIconHolder.loadDrawable(viewHolder.mIvIcon, fso, dwIcon); )
MimeTypeHelper.java
getIcon()
getMimeTypeInternal()
BreadcrumbView.java
DialogBreadcrumbView.java
init( this.mLoadingDialog.setMessage(getContext().getText(R.string.loading_message)); )
packages/apps/CMFileManager/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java:271: NavigationView.this.mBreadcrumb.startLoading();