最近做软件的时候需要用到listView但是传统的ListView感觉已经无法满足我了,于是我去git上搜了下listview的开源框架,大部分关于listview的开源框架都是牵扯到下拉刷新的我也不否认这个确实很重要,但是我现在用不上 ,于是搜索很久后终于收到个好玩叫SwipeListView,这个的主要作用是listview的每一行可以通过手指控制向右或向左滑动到哪个位子比如1/3或1/2停下来,再空白的地方也可以放些布局,比较好玩。
具体的实现方法是下载个swipelistView的项目,将项目
然后在布局文件中添加代码:
<com.example.listviewdemo.SwipeListView
android:id="@+id/example_lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
android:listSelector="#00000000"
swipe:swipeActionLeft="reveal"
swipe:swipeActionRight="reveal"
swipe:swipeAnimationTime="0"
swipe:swipeBackView="@+id/back"
swipe:swipeCloseAllItemsWhenMoveList="true"
swipe:swipeFrontView="@+id/front"
swipe:swipeMode="both"
swipe:swipeOffsetLeft="0dp"
swipe:swipeOffsetRight="0dp"
swipe:swipeOpenOnLongPress="false" />
在主界面的oncreate方法中添加代码
<span style="white-space:pre"> </span>setContentView(R.layout.activity_main);
SwipeListView mSwipeListView = (SwipeListView) findViewById(R.id.example_lv_list);
testData = getTestData();
SwipeAdapter mAdapter = new SwipeAdapter(this, R.layout.package_row, testData,
mSwipeListView);
deviceWidth = getDeviceWidth();
mSwipeListView.setAdapter(mAdapter);
reload();
其中SwipeAdapter是适配器的代码是:
public class SwipeAdapter extends ArrayAdapter<String> {
private LayoutInflater mInflater;
private List<String> objects;
private AlertDialog dialog;
private SwipeListView mSwipeListView;
List<News> lista=DataSupport.findAll(News.class);
public SwipeAdapter(Context context, int textViewResourceId,
List<String> objects, SwipeListView mSwipeListView) {
super(context, textViewResourceId, objects);
this.objects = objects;
this.mSwipeListView = mSwipeListView;
mInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater
.inflate(R.layout.package_row, parent, false);
holder = new ViewHolder();
holder.key = (TextView) convertView.findViewById(R.id.tv_key);
holder.bt_delete = (Button) convertView
.findViewById(R.id.bt_delete);
holder.cb_delete = (CheckBox) convertView
.findViewById(R.id.cb_delete);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.cb_delete
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
holder.bt_delete.setVisibility(View.VISIBLE);
} else {
holder.bt_delete.setVisibility(View.INVISIBLE);
}
}
});
holder.bt_delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(
getContext());
builder.setTitle("Whether or not to delete?");
builder.setIcon(R.drawable.ic_launcher);
builder.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
mSwipeListView.closeAnimate(position);
mSwipeListView.dismiss(position);
System.out.println("取到的id:"+lista.get(position).getId());
DataSupport.delete(News.class, lista.get(position).getId());
dialog.dismiss();
}
});
builder.setNegativeButton("No",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
dialog.dismiss();
}
});
builder.create();
dialog = builder.show();
}
});
String item = getItem(position);
holder.key.setText(item);
return convertView;
}
class ViewHolder {
TextView key;
Button bt_delete;
CheckBox cb_delete;
}
其中layout文件代码是:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<RelativeLayout
android:id="@+id/back"
android:layout_width="match_parent"
android:layout_height="80dp"
android:tag="back"
android:background="#FFBB33"
>
<CheckBox
android:id="@+id/cb_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp" />
<Button
android:id="@+id/bt_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/cb_delete"
android:text="delete"
android:visibility="invisible" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/front"
android:orientation="vertical"
android:background="#FF8800"
android:layout_width="match_parent"
android:layout_height="80dp" >
<!-- 电影代号 -->
<TextView
android:id="@+id/tv_key"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="#ffffff"
android:text="Ket"
android:textSize="26dp" />
</RelativeLayout>
</FrameLayout>
其中值得注意的是整个包裹在framelayout显示在listview上的放在下面。
剩下的两个方法的代码:
private List<String> getTestData() {
System.out.println("进来了");
List<String> dome = new ArrayList<String>();
lista.clear();
lista.addAll(DataSupport.findAll(News.class));
for (int i = 0; i < lista.size(); i++) {
System.out.println("取到的key:" + lista.get(i).getKey());
dome.add(lista.get(i).getKey());
}
return dome;
}
以上是添加listview中的数据。
/**
* 获取屏幕宽度
*
* @return
*/
private int getDeviceWidth() {
return getResources().getDisplayMetrics().widthPixels;
}
/**
* 条目样式
*/
private void reload() {
mSwipeListView.setSwipeMode(SwipeListView.SWIPE_MODE_LEFT);
mSwipeListView.setSwipeActionLeft(SwipeListView.SWIPE_ACTION_REVEAL);
mSwipeListView.setOffsetLeft(deviceWidth * 1 / 3);
mSwipeListView.setAnimationTime(0);
mSwipeListView.setSwipeOpenOnLongPress(false);
}
这个是配置swiperlistview每一行的样式,我这是向左移动到1/3的位置
最后swipelistview每行的点击事件:
mSwipeListView.setSwipeListViewListener(new TestBaseSwipeListViewListener());
class TestBaseSwipeListViewListener extends BaseSwipeListViewListener {
@Override
public void onClickFrontView(int position) {
super.onClickFrontView(position);
}
@Override
public void onDismiss(int[] reverseSortedPositions) {
}
第一个方法是swipelistView的每行点击方法。
第二个方法是删除行的方法