2014-07-10 42 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中的枚举非常有用:) –