我在使用自定义ListView
适配器时遇到了一些麻烦
我发送请求到一个网站,它给了我一些数据的xml。然后我解析xml,并在ListView
扩展BaseAdapter
的类的帮助下将收到的数据放入startIndex
。但有时我的请求数据太多,所以最好的方法是从网站询问不是所有数据,而是范围值,然后将它们放入客户端的ArrayList中。
当用户按下Forward按钮时,新的值从站点接收并被放入ArrayList,然后用户按下Backward按钮,因此在这种情况下没有必要向网站发出请求,因为数据已经存储在ArrayList中。
我使用endIndex
和View getView()
变量在加载的数据之间以及从Web服务器询问新数据时进行导航。我试图设置哪些值应该在我的适配器的ListView
方法中显示,但在这种情况下我的应用程序崩溃了。这是代码。如何仅加载@Override
public View getView(int position, View convertView, ViewGroup parent) {
// I tried to add only specific values, here my app crashes
if (position < startIndex || position > endIndex) return null;
View view = convertView;
if (view == null){
view = this.lInflater.inflate(R.layout.book_item,parent,false);
}
Book b = getBook(position);
TextView tv = (TextView)view.findViewById(R.id.authorName);
tv.setText(b.author);
tv = (TextView) view.findViewById(R.id.bookName);
tv.setText(b.name);
CheckBox chBox = (CheckBox)view.findViewById(R.id.basketChk);
chBox.setOnCheckedChangeListener(this);
chBox.setTag(position);
chBox.setChecked(b.getStatus());
return view;
}
中的特定数据。
全部谢谢!
{{1}}
答案 0 :(得分:0)
据我所知,您需要在检索缓存数据时添加新数据列表,您可以通过添加/删除/更新适配器中使用的集合中的数据来执行此操作。并调用yourAdapter.notifyDataSetChanged()
将适配器重新加载到列表中。
答案 1 :(得分:0)
我对您的要求的理解是:
您将首先根据某个范围从站点获取特定的数据集并将其显示给用户。当用户点击向前时,如果没有从网上获取并显示该数据,您将检查该范围的数据,当用户点击后显示以前的数据时。
基于这种理解,我提出以下解决方案:
1.维护一个HashMap,其范围为关键,并将来自该范围的网站数据的ArrayList作为值
2.现在使用此HashMap检查范围的数据是否可用。如果没有从我们那里获取它并将其添加到HashMap并使用它
3.在为ListView创建适配器时,创建新的ArrayList并将其作为源传递。
4.现在根据您是否拥有HashMap中给定范围的数据,或者从Web获取并添加HashMap,清除适配器中传递的ArrayList并添加所有新数据并在adater上调用notifyDataChange。 p>
我希望步骤清晰有用。