我是Android开发的新手,并尝试开发我的第一个测试应用。 关于显示超过500个字符串并应用搜索,我有一个最佳实践问题。
我有以下食物卡路里样本列表:
类型 - 部分大小 - 每100克(3.5盎司)
Crab fresh - 200 cals - 110 cals
烤鸭 - 400卡 - 430卡尔牛肉(烤) - 300 cals - 280 cals
牛肉汉堡冷冻 - 320 cals - 280 cals
鸡肉 - 220 cals - 200 cals
等.....超过500种食物。
执行以下操作是安全的还是最佳做法?
public class FoodCal {
public String Type;
public String PortionSize;
public String PerGram;
public FoodCal(String type, String portionSize, String perGram) {
this.Type = type;
this.PortionSize = portionSize;
this.PerGram = perGram;
}
}
全球课程:
public class Global {
public static ArrayList<FoodCal> GetFoodCalList() {
ArrayList<FoodCal> FoodCalList = new ArrayList<>();
FoodCalList.add(new FoodCal("Crab fresh","200 cals","110 cals"));
FoodCalList.add(new FoodCal("Duck roast","400 cals","430 cals"));
etc.......
return (FoodCalList);
}
}
FoodListAdapter类
class FoodListAdapter extends BaseAdapter {
ArrayList<SystemName> foodListLocal;
ArrayList<SystemName> fullFoodList;
FoodListAdapter() {
foodListLocal = Global.GetFoodCalList();
}
public void filter(String charText) {
fullFoodList = Global.GetFoodCalList();
foodListLocal.clear();
if (charText.length() == 0) {
foodListLocal = Global.GetFoodCalList();
} else {
for (FoodCal food : fullFoodList) {
if (food.Type.contains(charText)) {
foodListLocal.add(food);
}
}
}
//Notify UI
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return foodListLocal.size();
}
@Override
public Object getItem(int position) {
return foodListLocal.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = getLayoutInflater();
View myView = mInflater.inflate(R.layout.food_view, null);
TextView txtFoodName = (TextView) myView.findViewById(R.id.txtFoodName);
TextView txtSize = (TextView) myView.findViewById(R.id.txtSize);
TextView txtPerGrams = (TextView) myView.findViewById(R.id.txtPerGrams);
FoodCal temp = foodListLocal.get(position);
txtFoodName.setText(temp.Type);
txtSize.setText(temp.PortionSize);
txtPerGrams.setText(temp.PerGram);
return myView;
}
}
我应该使用Json文件,它会有良好的性能吗? 如果Json更好,请编写代码来完成它或最佳实践。
另请注明我的代码是否需要更多增强功能。
提前致谢。
答案 0 :(得分:1)
并不总是最好的&#34;,这实际上取决于您的需求。如果这个列表永远不会改变,我就不会像你做的那样预先将它们加载到List
中,除非我将列表不可修改:
public class Globals {
// other classes can refer to this directly with Globals.FOOD_CAL_LIST
public static final List<FoodCal> FOOD_CAL_LIST =
Collections.unmodifiableList(buildFoodCalList());
private static List<FoodCal> buildFoodCalList() {
List<FoodCal> list = new ArrayList<>();
list.add(new FoodCal("Crab fresh","200 cals","110 cals"));
list.add(new FoodCal("Duck roast","400 cals","430 cals"));
...
return (FoodCalList);
}
}
如果您的列表需要能够更改,那么它取决于 您的列表的更改方式。如果您始终是提供列表的人,那么听起来您需要的是一个托管最新信息的地方,您的应用需要不时下载以更新设备上的内容。有许多用于拨打网络电话的图书馆,由您决定使用哪一个。此外,您如何呈现该数据以及如何解析数据在很大程度上取决于您。您可以使用JSON,XML,CSV文件等进行此操作。
需要更改的一件事是您过滤列表的方式。您的filter
方法调用notifyDataSetChanged()
,需要从主线程完成。这意味着您正在主线程上运行过滤器操作,这很糟糕,因为这需要时间并在此期间阻止UI线程。
执行此操作的正确方法是使适配器实现Filterable
接口,并将此逻辑放在Filter
的子类中。您可以看到完整的示例in this answer。
答案 1 :(得分:0)
如果您的列表需要更改,那么您需要更改代码,最好创建一个json文件并解析json对象以创建类类型对象。 点击链接了解json解析https://developer.android.com/reference/android/util/JsonReader.html