Android开源框架SwipeMenuListView
开源框架SwipeMenuListView可以让ListView条目可滑动,并且在条目上面添加控件,并设置点击事件。
效果:
上面是我从源码中把主要的八个类,复制到我的项目中,就可以长久使用这个开源框架。而且直接复制网上的源码还是有点问题的(比如Menu资源文件报错!)
如图:
使用:
一.布局文件
<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"
tools:context="${relativePackage}.${activityClass}" >
<!-- 提示一下:包名要跟程序实际包名一样-->
<com.example.swip.swipemenulistview.SwipeMenuListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
二.java代码:
1.实例化自定View
SwipeMenuListView mListView= (SwipeMenuListView) findViewById(R.id.listView);
2.创建适配器,其实是一个继承BaseAdapter的类
AppAdapter mAdapter = new AppAdapter();
3.給ListView添加适配器
mListView.setAdapter(mAdapter);
4.创建SwipeMenuCreator对象,可以在里面设置滑动Itme后显示的视图控件,可以设置想要的个数。
具体代码看示例。。。
5.給SwipeMenuListView 添加SwipeMenuCreator对象
mListView.setMenuCreator(creator);
6.设置各种监听
//设置点击Item里面控件的监听
mListView.setOnMenuItemClickListener
//设置点击Item条目的监听,长按Item条目的监听等等监听
其实SwipeMenuListView就是一个List View,不过这里多设置了几个方法,并添加了以恶小手势判断等等。
主方法类示例:
package com.example.swip;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.swip.swipemenulistview.*;
import java.util.ArrayList;
import java.util.List;
public class MyActivity extends Activity {
private List<String> list = new ArrayList<String>();
private AppAdapter mAdapter;
private SwipeMenuListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
for (int i = 0; i < 100; i++) {
list.add("item" + i + "行");
}
mListView = (SwipeMenuListView) findViewById(R.id.listView);
mAdapter = new AppAdapter();
mListView.setAdapter(mAdapter);
// step 1. create a MenuCreator
SwipeMenuCreator creator = new SwipeMenuCreator() {
@Override
public void create(SwipeMenu menu) {
// create "open" item
SwipeMenuItem openItem = new SwipeMenuItem(
getApplicationContext());
// set item background
openItem.setBackground(new ColorDrawable(Color.rgb(0xC9, 0xC9,
0xCE)));
// set item width
openItem.setWidth(dp2px(90));
// set item title
openItem.setTitle("Open");
// set item title fontsize
openItem.setTitleSize(18);
// set item title font color
openItem.setTitleColor(Color.WHITE);
// add to menu
menu.addMenuItem(openItem);
// create "delete" item
SwipeMenuItem deleteItem = new SwipeMenuItem(
getApplicationContext());
// set item background
deleteItem.setBackground(new ColorDrawable(Color.rgb(0xF9,
0x3F, 0x25)));
// set item width
deleteItem.setWidth(dp2px(90));
// set a icon
deleteItem.setIcon(R.drawable.ic_delete);
// add to menu
menu.addMenuItem(deleteItem);
}
};
// set creator
mListView.setMenuCreator(creator);
// step 2. listener item click event
mListView.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
String item = list.get(position);
switch (index) {
case 0:
// open
Toast.makeText(MyActivity.this,"点击了open",Toast.LENGTH_LONG).show();
break;
case 1:
// delete
// delete(item);
list.remove(position);
mAdapter.notifyDataSetChanged();
break;
}
return false;
}
});
// other setting
// listView.setCloseInterpolator(new BounceInterpolator());
// test item long click
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(), position + " long click", Toast.LENGTH_SHORT).show();
return false;
}
});
// test item click
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(), position + " click", Toast.LENGTH_SHORT).show();
}
});
}
class AppAdapter extends BaseSwipListAdapter {
@Override
public int getCount() {
return list.size();
}
@Override
public String getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(getApplicationContext(),
R.layout.item_list, null);
new ViewHolder(convertView);
}
ViewHolder holder = (ViewHolder) convertView.getTag();
String item = getItem(position);
holder.iv_icon.setImageResource(R.drawable.ic_launcher);
holder.tv_name.setText(item );
holder.iv_icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MyActivity.this, "点击了图标", Toast.LENGTH_SHORT).show();
}
});
holder.tv_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MyActivity.this, "点击了文字", Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
class ViewHolder {
ImageView iv_icon;
TextView tv_name;
public ViewHolder(View view) {
iv_icon = (ImageView) view.findViewById(R.id.iv_icon);
tv_name = (TextView) view.findViewById(R.id.tv_name);
view.setTag(this);
}
}
@Override
public boolean getSwipEnableByPosition(int position) { //设置条目是否可以滑动
// if (position % 2 == 0) {
// return false;
// }
return true;
}
}
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
getResources().getDisplayMetrics());
}
}
下面是我程序的源码:
http://download.csdn.net/detail/wenzhi20102321/9812332
随便也提供一下经过我简单修改后可运行的复杂源码(简单注释了Menu资源调用,否则不能运行程序):
http://download.csdn.net/detail/wenzhi20102321/9812331
注意:程序运行需要V4兼容包!
复杂源码效果:
其实一般应用简单效果就够了,所有的Item滑出的效果一样!复杂效果就是根据条目的内容或属性不同设置滑动后显示的数据不同,用得较少!
共勉:程序袁靠的是一种信念,说不清道不明!