奇怪的ListView排序

时间:2014-09-03 14:18:58

标签: android listview sorting android-arrayadapter

我遇到了以下问题:

Wrong sorted ListView

正如您在图片中看到的那样, CITROEN 组标题并不高于所有雪铁龙车型,例如 DACIA 。 奇怪的是,有大约20个汽车品牌,如宝马,奥迪......并且每个组头都高于它的儿童用品,但不是CITROEN。

此列表视图由html文件填充,该文件具有以下结构:

<optgroup label="BMW">    
<option value="225" >BMW X3 3.0si</option>
    <option value="226" >BMW X5 3.0d A/T</option>
    <option value="227" >BMW X5 4.8i A/T</option>
</optgroup>
<optgroup label="CITROËN">
    <option value="67" >CITROËN C1 1.0i</option>
    <option value="68" >CITROËN C1 1.4 HDi</option>
    <option value="69" >CITROËN C2 1.1i</option>

我正在使用自定义适配器。以下是比较方法的源代码:

 @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        progressDialog.dismiss();

        adapter = new ModelsAdaper(CarsList.this, generateData());

        /*Should sort the ListView alphabetically*/
        adapter.sort(new Comparator<Model>() {
            @Override
            public int compare(Model lhs, Model rhs) {
                return lhs.getTitle().compareTo(rhs.getTitle());
            }
        });
        setListAdapter(adapter);

generateData()方法:

private ArrayList<Model> generateData() {
    models = new ArrayList<Model>();

    /*This loop adds car brands to the listview*/
    for(String s: brands){
       models.add(new Model(R.drawable.alfa_romeo_icon_52,s));
    }

    /*This loop inserts car models into the listview*/
    int key;
    for(int i = 0; i < hashMap.size(); i++) {
        key = hashMap.keyAt(i);
        models.add(new Model(hashMap.get(key)));
    }
    return models;
}

最后,Model类

public class Model {
private String title;
private boolean isGroupHeader = false;
private int icon;

/**
 * This constructor will be used for creating instance od target_item
  * @param title is content of the item
 */
public Model(String title){
     this.title = title;
 }

/**
 * This constructor will be used for group headers
 * @param icon is icon of the group
 * @param title is name of the group
 */
public Model(int icon, String title){
    this.icon = icon;
    this.title = title;
    isGroupHeader = true;
}

修改 根据要求,这是HTMLParser类源代码。它的构造函数是从CarsList Activity调用的,它扩展了ListActivity

public class HTMLParser {
private String value;
private InputStream is = null;
private Context context=null;
private org.jsoup.nodes.Document document = null;
SparseArray<String> hashMap =  new SparseArray<String>();
private ArrayList<String> modelsList = new ArrayList<String>();
private ArrayList<String> brandsList = new ArrayList<String>();

/**
 * Constructor is used to pass instance of CarsList Context to get html asset
 * @param context instance of the CarsList activity context
 */
public HTMLParser(Context context) throws IOException {
    this.context = context;
    is = context.getAssets().open("modely aut.html");
    document = Jsoup.parse(is,"UTF-8","http://example.com");
}

/**
 * The purpose of this method is to parse car brands from html asset
 * @return ArrayList of car brands
 */
public ArrayList<String> parseCarBrands(){
    Elements models = document.select("optgroup");
    for (Element e: models){
        brandsList.add(e.attr("label"));
    }
    return brandsList;
}

/**
 * Method parses all car models from html asset. For IO safety operations, it is recommended to call this method
 * after parseCarBrands() method, because parseCarModels() method closes inputStream.
 * @return SparseArray consisting of key: carID and value: car model
 */
public SparseArray<String> parseCarModels(){
    try {
        Elements models = document.select("option");
        for (Element e: models){
            int res = new Scanner(e.toString()).useDelimiter("\\D+").nextInt();
            value = e.html();
            modelsList.add(value);
            hashMap.put(res,value);
        }
    }   finally {
        if(is!=null){
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return hashMap;
}

}

编辑2可能的问题来源 我用相同的代码进行了一些测试,但仅限于简单的java项目。它看起来像一些编码问题。 使用时

Elements models2 = doc.select("option");

        for (Element e: models2){
           int key =  Integer.parseInt(e.attr("value"));
            String modelName = e.html();
            modelsList.add(value);
        }

System.out.println(modelName)的输出如下所示:

CITRO&Euml;N C4 1.6i 16V EP turbo

但是当使用String s = e.attr("label");解析一个品牌名称时,输出就是应该的。 你有什么想法,问题出在哪里?如果有必要,我会发布代码的其他部分。 我要感谢你为我的问题付出的所有时间和精力

1 个答案:

答案 0 :(得分:1)

我做到了,但这是一件很蠢的事。我改变了parseCarModels()中的一些内容 首先,我已将返回类型更改为LinkedHashMap<Integer,String>。现在解析html似乎更快。 然后我将value变量从String更改为CharSequence。这允许我使用Html.fromHtml(e.html),因此最终代码如下所示:

public LinkedHashMap<Integer,String> parseCarModels(){
    Elements models = document.select("option");
    int key;
    CharSequence value;
    for(Element e: models){
        key = Integer.parseInt(e.attr("value"));
        value = Html.fromHtml(e.html());
        hashMap.put(key,value.toString());
    }
    if(is!=null){
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return hashMap;
}

感谢您的帮助。我真的很感激。我希望这段代码不是很无效

相关问题