我遇到了以下问题:
正如您在图片中看到的那样, 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ËN C4 1.6i 16V EP turbo
但是当使用String s = e.attr("label");
解析一个品牌名称时,输出就是应该的。
你有什么想法,问题出在哪里?如果有必要,我会发布代码的其他部分。
我要感谢你为我的问题付出的所有时间和精力
答案 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;
}
感谢您的帮助。我真的很感激。我希望这段代码不是很无效