2014-07-10 43 views
0

經過數小時的搜索,我不知道如何製作一個比較器可以下載。 我發現這個「Parcelable東西」有點「缺內容」 ...(Parcelable沒有連writeBoolean)比較器<Object>可以分類

public class T implements Parcelable{ 

    ... 

    public static Comparator<T> Compare = new Comparator<T>() {...} 

    ... 

    public void writeToParcel(Parcel out, int flags) { 
     //how to write "Compare" 
    } 

    private T(Parcel in) { 
     //how to read "Compare" 
    } 

} 

謝謝。

編輯:

因此,這裏是爲什麼F類必須parcelable細節(簡化和調整)。請注意,代碼來自完成的iOS項目。這將有利於維護如果架構保持不變... :-)

public class F implements Parcelable{ 
    … 
    public ArrayList<T> listArray; 
    public HashMap<String,Comparator<T>> sortElementMap; 
} 

_

public class T implements Parcelable{ 
    … 
    public static Comparator<T> CompareByName = new Comparator<T>() {…}}; 
    public static Comparator<T> CompareByDate = new Comparator<T>() { … }}; 
} 

首先,在配置類(這裏是簡化的)允許輕鬆地適應應用(的T變量之間的列數據庫匹配,過濾器/排序/搜索定義,...)

F f=new F(); 
f.sortElementMap.put("name",T.CompareByName) 
f.sortElementMap.put("date",T.CompareByDate) 

在前面的活動

Intent intent=new Intent(…); 
intent.putExtra("F",F); 
startActivity(intent); 

在當前活動

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

… 
    Intent intent = getIntent(); 
    f = (F)intent.getParcelableExtra("F"); 
} 


// the list to be sorted 
listArray=new ArrayList<String>(f.listArray); 

listAdapter = new ListAdapter(this, R.layout.list_item, listArray); 
    listView = (ListView) findViewById(R.id.listView); 
    listView.setAdapter(listAdapter); 
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     //@Override 
     public void onItemClick(AdapterView arg0, View view, 
           int position, long id) { 
     … 
     } 
    }); 


// the list with the different type of sorting 

sortArray=new ArrayList<String>(); 
Iterator it = f.sortElementMap.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry pairs = (Map.Entry)it.next(); 
     sortArray.add((String) pairs.getKey()); 
    } 

sortListAdapter = new ListAdapter(this, R.layout.list_item_sort, sortArray); 
    sortListView = (ListView) findViewById(R.id.sortListView); 
    sortListView.setAdapter(sortListAdapter); 
    sortListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     //@Override 
     public void onItemClick(AdapterView arg0, View view, 
           int position, long id) { 

      applyCurrentSelectedSort(); 

     } 
    }); 


void applyCurrentSelectedSort(){ 

    Iterator it = f.sortElementMap.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry pairs = (Map.Entry) it.next(); 

     for (int i = 0; i < sortListAdapter.getSelectedPosition().length; i++) { 
      if (sortListAdapter.getSelectedPosition()[i]) { 
       listAdapter.sort((java.util.Comparator<T>) pairs.getValue()); 
       break; 
      } 
     } 
    } 
} 
+1

這是靜態的。爲什麼你甚至想把一個靜態類放入一個可解釋的類? – EpicPandaForce

+0

在一個活動,以'HashMap的地圖<字符串,比較>'與意圖傳遞(因此必須Parcelable ...): 'listAdapter.sort((的java.util.Comparator )pairs.getValue()) ; //其中對是地圖的一個元素' – myz

+0

您可以添加活動代碼嗎?我同意@Zhuinden,它似乎並不需要讀/寫來自'parcel' – ujvl

回答

1
public enum Comparators { 

    BY_NAME(F.CompareByName), 
    BY_DATE(F.CompareByDate); 

    private Comparator comparator; 

    Comparators(final Comparator comparator) { 
      this.comparator = comparator; 
    } 

    public Comparator getComparator() { 
      return comparator; 
    } 

} 


... 

class F implements Parcelable { 

    List<String> comparatorNames = new ArrayList<>(); 

    .... .. 

    writeToParcel() { 

     //write list 
    } 


    readFromParcel() { 

     //read list 
    } 

} 

那麼無處不在,你想它:

f = (F)intent.getParcelableExtra("F"); 
Comparator c = Comparators.valueOf(f.getComparatorName(0)); 
+0

謝謝!我不知道這個Enum.valueOf()。最後,地圖是(關鍵是用於txt翻譯)。 – myz

+0

@myz在java中的枚舉非常有用:) –