Android listview未使用notifydataSetChanged进行更新
我的listview没有使用在前20项之后检索的数据更新自身 如果数据不是用json传递的,我检查了多次,但确实如此,只有listview没有用添加的数据更新自己 以下是我的部分代码:Android listview未使用notifydataSetChanged进行更新,android,listview,notifydatasetchanged,Android,Listview,Notifydatasetchanged,我的listview没有使用在前20项之后检索的数据更新自身 如果数据不是用json传递的,我检查了多次,但确实如此,只有listview没有用添加的数据更新自己 以下是我的部分代码: @Override public void onGetData(JSONObject obj) { Serie[] seriesList; if (obj != null) { if (pageNumber == 1) { series = Serie.se
@Override
public void onGetData(JSONObject obj) {
Serie[] seriesList;
if (obj != null) {
if (pageNumber == 1) {
series = Serie.serieListFromJSON(this, JsonHandling
.getInstance().getJSONArraySerieFromUrlTMDB(obj));
seriesList = series.toArray(new Serie[series.size()]);
adapter = new SearchCustomAdapter(this, seriesList);
lvSearch = (ListView) findViewById(R.id.lvSearch);
lvSearch.setAdapter(adapter);
lvSearch.setOnScrollListener(this);
} else {
try {
Toast.makeText(this, "obj is ?"+obj.toString(1), Toast.LENGTH_LONG).show();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//adapter.clear(); getting an unsupportedmethod exeption
series.addAll(Serie.serieListFromJSON(this, JsonHandling
.getInstance().getJSONArraySerieFromUrlTMDB(obj)));
seriesList = series.toArray(new Serie[series.size()]);
adapter.notifyDataSetChanged();
}
}
if (obj == null) {
Toast.makeText(this, "obj is null", Toast.LENGTH_LONG).show();
Serie serie = new Serie("not found", "");
seriesList = new Serie[series.size()];
seriesList[0] = serie;
adapter = new SearchCustomAdapter(this, seriesList);
lvSearch = (ListView) findViewById(R.id.lvSearch);
lvSearch.setAdapter(adapter);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
this.currentFirstVisibleItem = firstVisibleItem;
this.currentVisibleItemCount = visibleItemCount;
this.currentTotalItemcount=totalItemCount;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.currentScrollState = scrollState;
if(( currentFirstVisibleItem+currentVisibleItemCount) == currentTotalItemcount){
this.isScrollCompleted();
adapter.notifyDataSetChanged();
}
}
private void isScrollCompleted() {
if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) {
pageNumber++;
JsonHandling.getInstance().getJSONFromUrl(tvTitel.getText().toString(), tvYear.getText().toString(), iof, pageNumber);
adapter.notifyDataSetChanged();
}
pageNumber++;
JsonHandling.getInstance().getJSONFromUrl(tvTitel.getText().toString(), tvYear.getText().toString(), iof, pageNumber);
series.addAll(Serie.serieListFromJSON(this, JsonHandling.getInstance().getJSONArraySerieFromUrlTMDB(obj)));
seriesList = series.toArray(new Serie[series.size()]);
lvSearch.setAdapter(new SearchCustomAdapter(this, seriesList));
}
谁能告诉我我做错了什么或错过了什么
编辑:
在onscrollStateChange中添加了代码调整。仍然不确定为什么它应该在那里,而不是在获取数据
以下是searchcustumAdapter请求的:
public class SearchCustomAdapter extends ArrayAdapter<Serie> {
private final Context context;
private final Serie[] values;
public SearchCustomAdapter(Context context, Serie[] values) {
super(context, R.layout.search_row_layout, values);
this.context = context;
this.values = values;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null)
{
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.search_row_layout,
parent, false);
TextView textViewTitle = (TextView) rowView
.findViewById(R.id.SearchRowTitle);
TextView textViewYear = (TextView) rowView
.findViewById(R.id.SearchRowYear);
textViewTitle.setText(values[position].getTitle());
textViewYear.setText(values[position].getYear());
return rowView;
}
else
{
TextView textViewTitle = (TextView) convertView
.findViewById(R.id.SearchRowTitle);
TextView textViewYear = (TextView) convertView
.findViewById(R.id.SearchRowYear);
textViewTitle.setText(values[position].getTitle());
textViewYear.setText(values[position].getYear());
return convertView;
}
}
这确实有效,但不应该是这样。。。对吗?在
onScrollStateChanged method you are notifying list view but not changing its data
所以试着打电话
onGetData(JSONObject obj) in onscroll it may help you.
我不知道JSon,所以您可能需要调整下面的代码。在方法isScrollCompleted上,需要添加类似以下内容的代码:
series.addAll(JsonHandling.getInstance().getJSONFromUrl(tvTitel.getText().toString(), tvYear.getText().toString(), iof, pageNumber));
seriesList = series.toArray(new Serie[series.size()]);
adapter.notifyDataSetChanged();
注意:Array object seriesList在类中需要一个更高级别的作用域,而不仅仅是在onGetData中。为什么添加应该在滚动侦听器中,而不是在我获取数据的onGetData中?对于更高级别的独家新闻,您的意思是它不需要设置在onGetdata上,而需要设置在活动的创建上?它是。编辑:nm它在方法中让我了解,是什么触发了onGetData?它是来自JsonHandling.getInstance吗?如果是这样,您可以调用onGetData,从isScrollCompleted传递正确的obj,这是多态性的一个方面。当它在onGetData中声明时,我担心该对象中的数据可能会被清除,因为JVM认为当它超出方法onGetData的范围时,您不再需要它。我不确定这方面,主要是因为onGetData受到保护。JsonHandling.getInstance.getJSONFromUrl返回void public void getJSONFromUrlString titel,String year,IOnFinish listener,int pageNumber{JsonHandlingTMDBAsync task=new JsonHandlingTMDBAsynctitel,year,listener,pageNumber;task.execute;}在异步模式下,它将使用onPostExecuteJsonHandling.getInstance.getJSONFromUrltvTitel.getText.toString、tvYear.getText.toString、iof、pageNumber将数据提供给onGetData;series.addAllSerie.serieListFromJSONthis,JsonHandling.getInstance.GetJSONArraySrieFromurltmdbObj;seriesList=series.toarray新系列[series.size];adapter.notifyDataSetChanged;它是这样做的,但仍然是一样的,没有更新,我确实得到了第2页的祝酒词,并且得到了onGetData中的所有数据。那么有没有人知道解决问题的方法,因为现在我认为这不是一个很好的方法。设置一个新的适配器。