整合了重新整理、載入更多、滑動刪除功能的XListview,滑動xlistview
轉載請說明出處:http://blog.csdn.net/bz419927089
如果想做帶有重新整理、載入更多功能的listview,我們可以使用XListview。(已經停止維護,github地址:https://github.com/Maxwin-z/XListView-Android)
如果想做帶有滑動刪除功能的listview,我們可以使用SwipeListview。(github地址:https://github.com/47deg/android-swipelistview)
如果想做重新整理、載入更多、滑動刪除的listview呢?抱歉,我暫時還沒有發現同時擁有這些功能的listview。不過,我們可以整合多個開源項目,做出這樣的效果。
如果要實現這個功能,我們需要兩個開源項目的配合,一個就是XListview,來實現重新整理載入功能,而滑動刪除功能,我們則需要另外一個大神的開源項目,AndroidSwipeLayout(github地址:https://github.com/daimajia/AndroidSwipeLayout)。
話不多說,我們先看一下做出來的效果。
我感覺效果很不錯,對於一般的開發需求來說,已經夠了,下面,我們看一下項目的整合過程。
下面是整個項目的結構。
daimajia.swipe是AndroidSwipeLayout的代碼,me.maxwin.view是XListview的代碼,不需要再匯入其他的lib包了。
layout檔案夾下面的xlistview_footer,xlistview_header是XListview項目需要的布局檔案,values檔案夾下面的attrs是
SwipeLayout一些預置參數,colors是用到的兩個顏色值,strings是XListview用到的字串常量。
介紹完一些重要的檔案夾,我們看一下ListViewAdapter的代碼實現。
import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.TextView;import android.widget.Toast;import com.daimajia.swipe.SimpleSwipeListener;import com.daimajia.swipe.SwipeLayout;import com.daimajia.swipe.adapters.BaseSwipeAdapter;/** * * @author zhaokaiqiang * */public class ListViewAdapter extends BaseSwipeAdapter {// 內容物件private Context mContext;// 建構函式public ListViewAdapter(Context mContext) {this.mContext = mContext;}// SwipeLayout的布局id@Overridepublic int getSwipeLayoutResourceId(int position) {return R.id.swipe;}@Overridepublic View generateView(int position, ViewGroup parent) {View v = LayoutInflater.from(mContext).inflate(R.layout.listview_item,parent, false);final SwipeLayout swipeLayout = (SwipeLayout) v.findViewById(getSwipeLayoutResourceId(position));// 當隱藏的刪除menu被開啟的時候的回呼函數swipeLayout.addSwipeListener(new SimpleSwipeListener() {@Overridepublic void onOpen(SwipeLayout layout) {Toast.makeText(mContext, "Open", Toast.LENGTH_SHORT).show();}});// 雙擊的回呼函數swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {@Overridepublic void onDoubleClick(SwipeLayout layout,boolean surface) {Toast.makeText(mContext, "DoubleClick",Toast.LENGTH_SHORT).show();}});// 添加刪除布局的點擊事件v.findViewById(R.id.ll_menu).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {Toast.makeText(mContext, "delete", Toast.LENGTH_SHORT).show();//點擊完成之後,關閉刪除menuswipeLayout.close();}});return v;}//對控制項的填值操作獨立出來了,我們可以在這個方法裡面進行item的資料賦值@Overridepublic void fillValues(int position, View convertView) {TextView t = (TextView) convertView.findViewById(R.id.position);t.setText((position + 1) + "."<p class="p1"><span class="s1"> + </span>"我就是一行很長很長很長很長很長很長很長很長很長很長很長很長很長的測試文本"</p>);}@Overridepublic int getCount() {return 20;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}}
如果我們想使用帶有滑動布局的listvew,我們需要繼承BaseSwipeAdapter,然後對上面代碼中提到的重要方法進行實現。
除了adapter需要改變之外,我們還需要修改listview的item的布局檔案。
下面是listview_item.xml的代碼實現。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="80dp" > <com.daimajia.swipe.SwipeLayout android:id="@+id/swipe" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:id="@+id/ll_menu" android:layout_width="100dp" android:layout_height="match_parent" android:background="@android:color/holo_red_light" android:gravity="center" > <ImageView android:id="@+id/trash" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/trash" /> <TextView android:id="@+id/delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="刪除" android:textColor="#ffffff" android:textSize="15sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/item_selector" android:padding="6dp" > <TextView android:id="@+id/position" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </com.daimajia.swipe.SwipeLayout></LinearLayout>
整個item的布局內容需要用SwipeLayout包裹起來,然後添加id,這個id我們需要在adapter裡面作為
getSwipeLayoutResourceId()的返回值。
設定好adapter之後,我們就可以在MainActivity裡面為我們的xlistview添加適配器了,下面是一個簡單的例子。
package com.example.swiperefreshloadlistview;import me.maxwin.view.XListView;import me.maxwin.view.XListView.IXListViewListener;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.widget.Toast;/** * * @author zhaokaiqiang * */public class MainActivity extends Activity {private XListView mListView;// 只是用來類比非同步擷取資料private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);handler = new Handler();mListView = (XListView) findViewById(R.id.xListView);// 設定xlistview可以載入、重新整理mListView.setPullLoadEnable(true);mListView.setPullRefreshEnable(true);// 設定回呼函數mListView.setXListViewListener(new IXListViewListener() {@Overridepublic void onRefresh() {// 類比重新整理資料,1s之後停止重新整理handler.postDelayed(new Runnable() {@Overridepublic void run() {mListView.stopRefresh();Toast.makeText(MainActivity.this, "refresh",Toast.LENGTH_SHORT).show();}}, 1000);}@Overridepublic void onLoadMore() {handler.postDelayed(new Runnable() {// 類比載入資料,1s之後停止載入@Overridepublic void run() {mListView.stopLoadMore();Toast.makeText(MainActivity.this, "loadMore",Toast.LENGTH_SHORT).show();}}, 1000);}});// 設定適配器mListView.setAdapter(new ListViewAdapter(this));}}
好了,完成這些之後,我們就實現了重新整理、載入、滑動刪除功能的多功能lixtview了。
項目的原始碼,請到我的github下載。
https://github.com/ZhaoKaiQiang/SwipeRefreshLoadListview
自訂ImageView控制項 ,通過響應使用者的滑動事實現轉盤的功可以 ,怎同步重新整理XML中其他TextVew控制項的顯示?
@Override
public void draw(Canvas canvas) {
// 你的代碼
super.draw(canvas);
}
已經使用ViewPager實現了滑動的效果,但是發現想在每個子頁中增加功可以,子頁中的按鈕事件不可以被監聽到
這個呢,我通常是寫一個對應的ViewHolder類來處理。
比如你可以建一個CalculatorViewHolder.java來處理任何跟這個頁面相關的事件和初始化等操作。在CalculatorViewHolder這個類中,寫一個構造方法,把必須要傳入的參數填上,比如Context之類的。然後必須要有一個getView方法,返回一個View,供viewpager加入到List<View>裡。
像這樣:
public View getView(){setView();findViewsById();initViews();addListeners();return view;}在你的NewoneActivity中,先定義一個CalculatorViewHolder對象,new的時候傳入對應的參數,需要得到此view的時候就寫holder.getView()。當然,如果要在NewoneActivity中對此介面做一些操作,可以在CalculatorViewHolder中寫幾個public的方法,然後這樣調用就好了
holder.mothed();
這樣單獨一個類的好處是降低偶合,而且代碼條理更清晰。