【发布时间】:2014-07-10 11:00:09
【问题描述】:
经过数小时的搜索,我不知道如何使 Comparator 可打包。 我发现这个“Parcelable 的东西”有点“缺少内容”......(Parcelable 甚至没有 writeBoolean)
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;
}
}
}
}
【问题讨论】:
-
它是静态的。您为什么还要尝试将静态类放入 parcelable 中?
-
在活动中,
HashMap map <String,Comparator<T>>通过 Intent 传递(因此必须是 Parcelable...):listAdapter.sort((java.util.Comparator<T>) pairs.getValue()); //where pairs is an element of map -
您可以添加您的活动代码吗?我同意@Zhuinden,您似乎不需要读/写
parcel -
这是一个非常糟糕的架构(这只是开始)。您不必打包比较器,因为它们不是存储在 F 的对象中,而是存储在 F 的类中。我建议制作一个静态映射或(这样更好)一个排序引擎的枚举。
-
@SemyonDanilov 是的。但想法是只在一个类中声明事物。因此,如果您想添加一个比较器,您不必查看所有类来查看它的使用位置。我怎样才能在一个遥远的类中获得正确的比较器而不做:
if("Name") then CompareByName if("Date") then CompareByDate if (...)Java 反射是否可能?谢谢。
标签: java android android-intent android-activity parcelable