2013-03-15 94 views
0

我正在阅读HTML页面,并从包含two colums的表中获取值。这些值我需要插入到ListView如何从ArrayAdapter填充ListView

我很难理解ArraysArrayAdapter的概念,所以我试着通过阅读各种代码示例来阐述一些内容。我的代码工作完美时,我静态填充我的ArrayAdapter(在Java代码中),但我需要使用循环(或东西?)填充数组的内容与我从HTML页面中获得的内容(所有这些代码正常工作并就位)。

这是我使用的是什么:

Ranking.java

public class Ranking { 
    public String month; 
    public String rank; 

    public Ranking() { 
     super(); 
    } 
    public Ranking(String month, String rank) { 
     super(); 
     this.month = month; 
     this.rank = rank; 
    } 
} 

此代码:

Ranking ranking_data[] = new Ranking[] { 
    new Ranking("January 2013", "67"), 
    new Ranking("February 2013", "45"), 
} 

然后,我引用ranking_data用我自己的RankingAdapter;

RankingAdapter adapter = new RankingAdapter(this, R.layout.listview_item_row, ranking_data);

所以我的问题是;

如何动态填充ranking_data?

例如,此不是似乎工作以填充循环;

Ranking ranking_data[] = null; 
String mVal1, mVal2; 
while (myIterator1.hasNext() && myIterator2.hasNext()) { 
    mVal1 = myIterator1.next().text(); 
    mVal2 = myIterator2.next().text(); 
    new Ranking(mVal1, mVal2); 
} 

这使我对我的呼吁RankingAdapter adapter = new RankingAdapter(this, R.layout.listview_item_row, ranking_data);一个NullPointerException,也许是因为我的ranking_data套初始化它null,但我应该怎么否则初始化呢?

编辑
RankingAdapter声明如下:

public class RankingAdapter extends ArrayAdapter<Ranking>是否有帮助?

编辑2

添加的代码为RankingAdapter.java

public class RankingAdapter extends ArrayAdapter<Ranking> { 
    Context context; 
    int layoutResourceId; 
    Ranking data[] = null; 

public RankingAdapter(Context context, int layoutResourceId, Ranking[] data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    RankingHolder holder = null; 

    if(row == null) { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new RankingHolder(); 
     holder.txtMonth = (TextView)row.findViewById(R.id.item_month); 
     holder.txtRank = (TextView)row.findViewById(R.id.item_rank); 

     row.setTag(holder); 
    } else { 
     holder = (RankingHolder)row.getTag(); 
    } 

    Ranking ranking = data[position]; 

    holder.txtMonth.setText(ranking.month); 
    holder.txtRank.setText(ranking.rank); 

    return row; 
} 
static class RankingHolder { 
    TextView txtMonth; 
    TextView txtRank; 
} 

}

+3

使用'型的ArrayList',如果你不知道你有多少个项目上榜,而不是阵列将在'ListView'中显示。如果你知道数量的项目,那么首先在添加项目之前定义'ranking_data'数组的大小 – 2013-03-15 17:57:38

+0

@ρяσѕρєяK我如何用'ArrayList'而不是Array来声明排名?抱歉,当涉及到阵列和东西时总共有n00b。查看我的Edit,了解我的'RankingAdapter'是如何声明的。 My RankingAdapter扩展了ArrayAdapter 。 – kaderud 2013-03-15 18:12:15

+0

http://stackoverflow.com/questions/15109406/how-to-set-json-parsed-data-in-a-listview-and-then-adding-search-functionality-i/15109592#15109592。检查答案。而不是NewData有Ranking类。相应地修改代码。 – Raghunandan 2013-03-15 18:24:01

回答

1

在你有wtitten的代码中,你没有向你的列表分配/添加数据,它只在第一时间初始化为null,并且出错。

你可以写类似如下:

//declare arraylist 
ArrayList<Ranking> ItemArray = new ArrayList<Ranking>(); 
String mVal1, mVal2; 
while (myIterator1.hasNext() && myIterator2.hasNext()) { 
    mVal1 = myIterator1.next().text(); 
    mVal2 = myIterator2.next().text(); 
    //add item in your arrayList 
    ItemArray.add(new Ranking(mVal1, mVal2)); 
} 

不要忘记写adapter.notifydatasetchanged(),如果你改变你的ListView

参考以下链接以获得自定义阵列适配器列表视图的清晰思路的内容:

http://www.vogella.com/articles/AndroidListView/article.html

+0

这是适合你的吗? – 2013-03-15 19:03:05

+0

排序的,这不是完整的解决我的问题,它并没有与解决我的问题了'RankingAdapter扩展ArrayAdapter ',但@ρяσѕρєяK解决了这个问题对我来说,如果他把它作为一个答案,他将获得接受答案奖励。不过,他确实得到了部分解决它的积极因素,就像他也建议的那样。 – kaderud 2013-03-15 22:49:43

0

初始化空集适配器,并更改收集的数据动态,后您将其更改为调用Array Adapter

的notifyDatasetChanged方法