显示和搜索超过500个字符串

时间:2016-12-23 18:03:07

标签: android json arraylist

我是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更好,请编写代码来完成它或最佳实践。

另请注明我的代码是否需要更多增强功能。

提前致谢。

2 个答案:

答案 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