今天介绍一个开源项目SwipeListView的使用。
源码下载:https://github.com/47deg/android-swipelistview。
解压之后有一个库和demo。
1、导入swipeListView库,报错需要nineoldandroids.jar和android-support-v4.jar库。android-support-v4.jar直接在Android SDK里的.\extras\android\support文件夹里找到。nineoldandroids.jar库需要到https://github.com/JakeWharton/NineOldAndroids/里下载。
2、导入demo,添加swipeListView库。
3、代码:
public class SwipeListViewExampleActivity extends FragmentActivity {
private static final int REQUEST_CODE_SETTINGS = 0;
private PackageAdapter adapter;
private List<PackageItem> data;
private SwipeListView swipeListView;
private ProgressDialog progressDialog;
private PullToRefreshScrollView scrollView;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.swipe_list_view_activity);
data = new ArrayList<PackageItem>();
adapter = new PackageAdapter(this, data);
scrollView = (PullToRefreshScrollView) findViewById(R.id.scrollview);
scrollView.setOnRefreshListener(new OnRefreshListener<ScrollView>() {
@Override
public void onRefresh(PullToRefreshBase<ScrollView> refreshView) {
new GetData().execute();
}
});
scrollView
.setOnPullEventListener(new OnPullEventListener<ScrollView>() {
@Override
public void onPullEvent(
PullToRefreshBase<ScrollView> refreshView,
State state, Mode direction) {
swipeListView.closeOpenedItems();
}
});
swipeListView = (SwipeListView) findViewById(R.id.example_lv_list);
if (Build.VERSION.SDK_INT >= 11) {
swipeListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
swipeListView
.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode,
int position, long id, boolean checked) {
mode.setTitle("Selected ("
+ swipeListView.getCountSelected() + ")");
}
@Override
public boolean onActionItemClicked(ActionMode mode,
MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_delete) {
swipeListView.dismissSelected();
return true;
}
return false;
}
@Override
public boolean onCreateActionMode(ActionMode mode,
Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.menu_choice_items, menu);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
swipeListView.unselectedChoiceStates();
}
@Override
public boolean onPrepareActionMode(ActionMode mode,
Menu menu) {
return false;
}
});
}
swipeListView.setSwipeListViewListener(new BaseSwipeListViewListener() {
@Override
public void onOpened(int position, boolean toRight) {
}
@Override
public void onClosed(int position, boolean fromRight) {
}
@Override
public void onListChanged() {
}
@Override
public void onMove(int position, float x) {
}
@Override
public void onStartOpen(int position, int action, boolean right) {
Log.d("swipe", String.format("onStartOpen %d - action %d",
position, action));
}
@Override
public void onStartClose(int position, boolean right) {
Log.d("swipe", String.format("onStartClose %d", position));
}
@Override
public void onClickFrontView(int position) {
Log.d("swipe", String.format("onClickFrontView %d", position));
}
@Override
public void onClickBackView(int position) {
Log.d("swipe", String.format("onClickBackView %d", position));
}
@Override
public void onDismiss(int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
data.remove(position);
}
adapter.notifyDataSetChanged();
Function.setListViewHeightBasedOnChildren(swipeListView);
}
});
swipeListView.setAdapter(adapter);
reload();
new ListAppTask().execute();
progressDialog = new ProgressDialog(this);
progressDialog.setMessage(getString(R.string.loading));
progressDialog.setCancelable(false);
progressDialog.show();
}
private void reload() {
SettingsManager settings = SettingsManager.getInstance();
swipeListView.setSwipeMode(settings.getSwipeMode());
swipeListView.setSwipeActionLeft(settings.getSwipeActionLeft());
swipeListView.setSwipeActionRight(settings.getSwipeActionRight());
swipeListView.setOffsetLeft(convertDpToPixel(settings
.getSwipeOffsetLeft()));
swipeListView.setOffsetRight(convertDpToPixel(settings
.getSwipeOffsetRight()));
swipeListView.setAnimationTime(100);
swipeListView
.setSwipeOpenOnLongPress(settings.isSwipeOpenOnLongPress());
}
public int convertDpToPixel(float dp) {
DisplayMetrics metrics = getResources().getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return (int) px;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_app, menu);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
final int id = item.getItemId();
if (id == android.R.id.home) {
finish();
} else if (id == R.id.menu_settings) {
Intent intent = new Intent(this, SettingsActivity.class);
startActivityForResult(intent, REQUEST_CODE_SETTINGS);
}
return true;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_SETTINGS:
reload();
}
}
public class ListAppTask extends AsyncTask<Void, Void, List<PackageItem>> {
protected List<PackageItem> doInBackground(Void... args) {
PackageManager appInfo = getPackageManager();
List<ApplicationInfo> listInfo = appInfo
.getInstalledApplications(0);
Collections.sort(listInfo,
new ApplicationInfo.DisplayNameComparator(appInfo));
List<PackageItem> data = new ArrayList<PackageItem>();
for (int index = 0; index < listInfo.size(); index++) {
try {
ApplicationInfo content = listInfo.get(index);
if ((content.flags != ApplicationInfo.FLAG_SYSTEM)
&& content.enabled) {
if (content.icon != 0) {
PackageItem item = new PackageItem();
item.setName(getPackageManager()
.getApplicationLabel(content).toString());
item.setPackageName(content.packageName);
item.setIcon(getPackageManager().getDrawable(
content.packageName, content.icon, content));
data.add(item);
}
}
} catch (Exception e) {
}
}
return data;
}
protected void onPostExecute(List<PackageItem> result) {
data.clear();
data.addAll(result);
adapter.notifyDataSetChanged();
Function.setListViewHeightBasedOnChildren(swipeListView);
if (progressDialog != null) {
progressDialog.dismiss();
progressDialog = null;
}
if (PreferencesManager.getInstance(
SwipeListViewExampleActivity.this).getShowAbout()) {
AboutDialog logOutDialog = new AboutDialog();
logOutDialog.show(getSupportFragmentManager(), "dialog");
}
}
}
class GetData extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
scrollView.onRefreshComplete();
super.onPostExecute(result);
}
}
}
注意:adapter通知更新数据之后再设置,swipeListView的模式。