Android listview未使用notifydataSetChanged进行更新

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

我的listview没有使用在前20项之后检索的数据更新自身

如果数据不是用json传递的,我检查了多次,但确实如此,只有listview没有用添加的数据更新自己

以下是我的部分代码:

@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中的所有数据。那么有没有人知道解决问题的方法,因为现在我认为这不是一个很好的方法。设置一个新的适配器。