編輯:關於Android編程
實現一種類似於qq中滑動列表的功能:
向左或者向右滑動,然後執行相關操作。
這裡用到的是GitHub上的開源控件SwipeListView,下載地址https://github.com/47deg/android-swipelistview,下載好了之後,我們可以把下載文件當作一個庫文件引用它,當然也可以直接把源代碼拷貝到我們的想木當中。SwipeListView還依賴一個Github上的第三方控件,叫做NineOldAndroids,下載地址https://github.com/JakeWharton/NineOldAndroids,nineoldandroids和swipelistview一樣,也是可以直接拷貝代碼進來或者當作一個庫文件來引用。本案例統一把他們都當作庫文件來引用。
先來看activity_main.xml
這裡就一個swipelistview控件,我說幾個不易理解的屬性
表示滑動時的操作,dismiss表示滑動時刪除,如果設置為reveal表示滑動時會顯示出item後面的選項
swipe:swipeActionLeft=”dismiss”
swipe:swipeActionRight=”reveal”
這個是背面布局的id(我們把直接看到的布局叫做前面的,滑動之後才能看到的布局叫做背面的),必須與背面布局id對應
swipe:swipeBackView=”@+id/back”
這個是滾動時候是否關閉背面的布局,true表示關閉,false表示不關閉,一般設置為true
swipe:swipeCloseAllItemsWhenMoveList=”true”
這個是前面布局的id,要與布局的id對應
swipe:swipeFrontView=”@+id/front”
both表示可以向左滑也可以向右滑,right和left分別表示只能向有或者向左滑動。
swipe:swipeMode=”both”
下面兩個表示向左或者向右滑動時的偏移量,一般不在xml文件中設置,而是在代碼中根據設置的大小來設置偏移量。
swipe:swipeOffsetLeft=”0dp”
swipe:swipeOffsetRight=”0dp”
再來看看Item布局文件,這裡包括前面的和後面的,兩個重疊在一起:
<framelayout android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
</framelayout>
這個布局是一個常規布局,我就不解釋了。
MainActivity.java,關鍵地方都有注釋
public class MainActivity extends Activity {
private SwipeListView mSwipeListView ;
private SwipeAdapter mAdapter ;
public static int deviceWidth ;
private List testData ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSwipeListView = (SwipeListView) findViewById(R.id.example_lv_list);
testData = getTestData();
//數據適配
mAdapter = new SwipeAdapter(this, R.layout.package_row, testData,mSwipeListView);
//拿到設備寬度
deviceWidth = getDeviceWidth();
mSwipeListView.setAdapter(mAdapter);
//設置事件監聽
mSwipeListView.setSwipeListViewListener( new TestBaseSwipeListViewListener());
reload();
}
private List getTestData() {
String [] obj = new String[]{紅樓夢,西游記,水浒傳,管錐編,宋詩選注,三國演義,android開發高級編程,紅樓夢,西游記,水浒傳,管錐編,宋詩選注,三國演義,android開發高級編程};
List list = new ArrayList(Arrays.asList(obj));
return list;
}
private int getDeviceWidth() {
return getResources().getDisplayMetrics().widthPixels;
}
private void reload() {
// mSwipeListView.setSwipeMode(SwipeListView.SWIPE_MODE_LEFT);
// mSwipeListView.setSwipeActionLeft(SwipeListView.SWIPE_ACTION_REVEAL);
// mSwipeListView.setSwipeActionRight(settings.getSwipeActionRight());
//滑動時向左偏移量,根據設備的大小來決定偏移量的大小
mSwipeListView.setOffsetLeft(deviceWidth * 1 / 3);
mSwipeListView.setOffsetRight(deviceWidth * 1 / 3);
// mSwipeListView.setOffsetRight(convertDpToPixel(settings.getSwipeOffsetRight()));
//設置動畫時間
mSwipeListView.setAnimationTime(30);
mSwipeListView.setSwipeOpenOnLongPress(false);
}
class TestBaseSwipeListViewListener extends BaseSwipeListViewListener{
//點擊每一項的響應事件
@Override
public void onClickFrontView(int position) {
super.onClickFrontView(position);
Toast.makeText(getApplicationContext(), testData.get(position), Toast.LENGTH_SHORT).show();
}
//關閉事件
@Override
public void onDismiss(int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
Log.i(lenve, position--:+position);
testData.remove(position);
}
mAdapter.notifyDataSetChanged();
}
}
}
數據適配器:
public class SwipeAdapter extends ArrayAdapter {
private LayoutInflater mInflater ;
private List objects ;
private SwipeListView mSwipeListView ;
public SwipeAdapter(Context context, int textViewResourceId,List 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) {
ViewHolder holder = null ;
if(convertView == null){
convertView = mInflater.inflate(R.layout.package_row, parent, false);
holder = new ViewHolder();
holder.mFrontText = (TextView) convertView.findViewById(R.id.example_row_tv_title);
holder.mBackEdit = (Button) convertView.findViewById(R.id.example_row_b_action_3);
holder.mBackDelete = (Button) convertView.findViewById(R.id.example_row_b_action_2);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.mBackDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//關閉動畫
mSwipeListView.closeAnimate(position);
//調用dismiss方法刪除該項(這個方法在MainActivity中)
mSwipeListView.dismiss(position);
}
});
String item = getItem(position);
holder.mFrontText.setText(item);
return convertView;
}
class ViewHolder{
TextView mFrontText ;
Button mBackEdit,mBackDelete ;
}
}
前言 Android中支持許多資源,包括圖片(Bitmap),對應於bitmap的文件夾是drawable,除了drawable,還有drawable-ld
作者:泥沙磚瓦漿木匠 網站:http://blog.csdn.net/jeffli1993 個人簽名:打算起手不凡寫出鴻篇巨作的人,往往堅持不了完成第一章節。 交流QQ
一、簡介上篇博客概括的介紹了硅谷商城項目的首頁技術要點。本篇內容給大家講解硅谷商城項目分類,分類頁面用的技術包括:采用FlycoTabLayout實現標簽和分類切換、布局
一、效果圖先來看看效果圖吧~~二、實現原理方案1、自定義ViewGroup-XCDanmuView,繼承RelativeLayout來實現,當然也可以繼承其他三大布局類哈