2016-07-09 3 views
1

Ich versuche, Daten basierend auf dem Scrollen mit ListView zu aktualisieren. Die Daten werden gut aktualisiert. Nach dem Aktualisieren der Daten ging die Listenansicht jedoch nach oben. Ich muss es gleich behalten. Ich habe viel aus dem Lagerbestand probiert. Nichts hilft. Ich glaube, ich habe einen Fehler in meinem Code gemacht. Bitte hilf mir zu lösen.Android ListView setzt den Scroll-Status zurück, wenn die Daten aktualisiert werden

mein Code:

public class ViewAll extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_view_all); 

     new GetMessage().execute(); 

     FinalMessage = new ArrayList<HashMap<String, String>>(); 

     ProgressBar footer = new ProgressBar(this); 
     ListView lv = (ListView) findViewById(listView); 
     lv.addFooterView(footer); 
    } 

    private void getMessageFromUrl() 
    { 

     new GetMessage().execute(); 
    } 

    private class GetMessage extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      ...... 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) 
     { 
      ServiceHandler sh = new ServiceHandler(); 
      nameValuePairs = new ArrayList<NameValuePair>(1); 
      nameValuePairs.add(new BasicNameValuePair("page",String.valueOf(page))); 
      String jsonStr = sh.makeServiceCall(url, ServiceHandler.POST, nameValuePairs); 
      Log.d("Response: ", "> " + jsonStr); 
      if (jsonStr != null) { 
       try { 
         ...... 
        } 
       } 
       catch (JSONException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
      else 
      { 
       Log.e("SericeHandler","Couldn't get any data from url"); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 


      runOnUiThread(new Runnable() { 
       public void run() { 

        if(dorefresh==1) 
        { 
         ListView lv = (ListView) findViewById(listView); 
         Customlistadapter adapter = new Customlistadapter(ViewAll.this, title1, msg1); 
         lv.setAdapter(adapter); 
         int index = lv.getFirstVisiblePosition(); 
         View v = lv.getChildAt(0); 
         int top = (v == null) ? 0 : v.getTop(); 
         lv.setSelectionFromTop(index, top); 

         page = page + 1; 
         lv.setOnScrollListener(new AbsListView.OnScrollListener() { 
          int currentVisibleItemCount; 
          int currentScrollState; 
          int currentFirstVisibleItem; 
          int totalItem; 

          @Override 
          public void onScrollStateChanged(AbsListView view, int scrollState) { 
           // TODO Auto-generated method stub 
           this.currentScrollState = scrollState; 
           this.isScrollCompleted(); 
          } 

          @Override 
          public void onScroll(AbsListView view, int firstVisibleItem, 
               int visibleItemCount, int totalItemCount) { 
           // TODO Auto-generated method stub 
           this.currentFirstVisibleItem = firstVisibleItem; 
           this.currentVisibleItemCount = visibleItemCount; 
           this.totalItem = totalItemCount; 
          } 

          private void isScrollCompleted() { 

           if (totalItem - currentFirstVisibleItem == currentVisibleItemCount 
             && this.currentScrollState == SCROLL_STATE_IDLE) { 
            getMessageFromUrl(); 
           } 
          } 
         }); 
         Toast.makeText(ViewAll.this, "Updated", Toast.LENGTH_SHORT).show(); 
        } 
        else 
        { 
         Toast.makeText(ViewAll.this, "No More Messages", Toast.LENGTH_SHORT).show(); 
        } 



       } 

      }); 
     } 

    } 
} 

CustomlistAdapter.java

public class Customlistadapter extends ArrayAdapter<String> { 
    ArrayList<String> title; 
    ArrayList<String> msg; 
    Context context; 
    public Customlistadapter(Activity context, ArrayList<String> text, ArrayList<String> msgView) { 
     super(context, R.layout.list_row, text); 
     // TODO Auto-generated constructor stub 
     this.title = text; 
     this.msg = msgView; 
     this.context = context; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View single_row = inflater.inflate(R.layout.list_row, null, 
       true); 
     TextView textView = (TextView) single_row.findViewById(R.id.title); 
     TextView msgView = (TextView) single_row.findViewById(R.id.msgView); 
     textView.setText(title.get(position)); 
     msgView.setText(msg.get(position)); 

     return single_row; 
    } 

} 

Antwort

1

Ihr Problem ist, dass Sie ein neues Customlistadapter jedes Mal, wenn Sie die Daten aktualisieren erstellen. Wenn Sie möchten, dass der ListView seinen Scroll-Status behält, müssen Sie den Adapter wiederverwenden. Ändern Sie einfach die Daten im Adapter und rufen Sie myAdapter.notifyDataSetChanged().

z. Wenn Ihr Adapter ein ArrayAdapter ist, können Sie folgendes tun:

ArrayAdapter adapter = (ArrayAdapter)listView.getAdapter(); 
adapter.clear(); 
adapter.addAll(newData); 
adapter.notifyDataSetChanged(); 
+0

Ich bin verwirrt. Ich habe bereits Adapter für customlistadapter .. Wo ich diesen Code hinzufügen muss. Ich habe den Customlistladapter-Code aktualisiert. Bitte hilf mir, wo ich das hinzufügen muss –

Verwandte Themen