2017-11-07 22 views
2

私はアンドロイドの初心者です。私はrecyclercviewでページネーションを取り組んでいます。私は(PHPを実行している)サーバーからデータを受け取り、JSON形式でデータを返すので、データは1-10,11-20などのように束ねられます。これでnotifyDataSetChangedを呼び出します。しかし、問題は、現在の位置を保持する代わりに、より多くのデータを取得するときに、recyclerviewが先頭に戻るようにスクロールすることです。これについてどうすればいいですか?RecyclerViewページ位置がスクロール位置を維持していない

スクロールバーが下になると、それはasynctask

AsynTaskトリガー:あなたが活動ののonCreateメソッドまたはフラグメントのonCreateViewに一度だけのどちらかアダプタを設定する必要がrecycler.setAdapter(scrollAdapter);この行を削除し

public class LoadRecharge extends AsyncTask<String, String, String> { 

    private boolean socketTimeout = false; 
    Context context; 
    public static final String TAG = "custom_message"; 
    public AsyncResponse delegate = null; 
    private String server_url = "https://blockgator.com/mobile/endless.php"; 

    public LoadRecharge(Context ctxt, AsyncResponse asyncResponse) { 
     delegate = asyncResponse; 
     context = ctxt; 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     if (connectGoogle()) { 

      String post_data = ""; 

      try { 
       URL url = new URL(server_url); 
       HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
       httpURLConnection.setRequestMethod("POST"); 
       httpURLConnection.setDoOutput(true); 
       httpURLConnection.setDoInput(true); 
       OutputStream outputStream = httpURLConnection.getOutputStream(); 
       BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")); 

       post_data = URLEncoder.encode("page", "UTF-8") + "=" + URLEncoder.encode(params[0], "UTF-8"); 

       bufferedWriter.write(post_data); 
       bufferedWriter.flush(); 
       outputStream.close(); 
       InputStream inputStream = httpURLConnection.getInputStream(); 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1")); 
       String result = ""; 
       String line = ""; 
       while ((line = bufferedReader.readLine()) != null) { 
        result += line; 
       } 
       bufferedReader.close(); 
       inputStream.close(); 
       httpURLConnection.disconnect(); 

       return result; 
      } catch (IOException e) { 
       Log.e(TAG, "error: " + e.getMessage()); 
      } 
     } else { 
      this.socketTimeout = true; 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     arr.add(null); 
     scrollAdapter.notifyItemInserted(arr.size() - 1); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     arr.remove(arr.size() - 1); 
     scrollAdapter.notifyItemRemoved(arr.size()); 

     if (this.socketTimeout) { 
      Toast.makeText(context, "unable to connect to server", Toast.LENGTH_SHORT).show(); 
     } else { 
      delegate.processFinish(result); 
     } 
    } 

    public boolean connectGoogle() { 
     try { 
      HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection()); 
      urlc.setConnectTimeout(3000); 
      urlc.connect(); 
      return (urlc.getResponseCode() == 200); 

     } catch (IOException e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 
} 

@Override 
public void processFinish(String output) { 
    try { 
     JSONObject jsonObject = new JSONObject(output); 
     if (jsonObject.get("status").toString().equals("success")) { 
      JSONArray jsonarr = jsonObject.getJSONArray("data"); 
      String columns[] = {"id", "bill_amount", "bill_price", "variation"}; 
      for (int i = 0; i < jsonarr.length(); i++) { 
       ArrayList<String> temp = new ArrayList<>(); 
       for (String column : columns) { 
        temp.add(jsonarr.getJSONObject(i).getString(column)); 
       } 
       arr.add(temp); 

       setAdapter(arr); 
      } 
     } else if (jsonObject.get("status").toString().equals("end")) { 
      total = "end"; 
     } 


    } catch (JSONException e) { 
     e.printStackTrace(); 
     Toast.makeText(this, "exception from json", Toast.LENGTH_LONG).show(); 
    } catch (NullPointerException e) { 
     Toast.makeText(this, "Unable to connect to server...", Toast.LENGTH_LONG).show(); 
     Toast.makeText(this, "Null from json", Toast.LENGTH_LONG).show(); 
    } 
} 

public void setAdapter(ArrayList<ArrayList<String>> arr) { 
    recycler.setAdapter(scrollAdapter); 
    scrollAdapter.notifyDataSetChanged(); 
    scrollAdapter.setLoading(); 
    scrollAdapter.setOnItemClickListener(this); 
    scrollAdapter.setOnLoadMoreListener(this); 
} 
+0

でちょうどノートを置くために0を使用して、ソース

を更新したアダプタをnotifing、そのようなレトロフィットやバレーボールなどのAndroidのための優れたネットワーク・ライブラリは、あります。私が出発するときに、誰かが私について話してくれたらと思う。 – C0D3LIC1OU5

+0

ああ、私はすぐにボレーに取り組んでいるつもりです。ありがとう –

答えて

1

を方法。

+0

ありがとう..これは私を助けた –

+0

クール!それはあなたのためにうれしいです。 –

0

setAdapter()で行う必要はありませんrecycler.setAdapter(scrollAdapter);は再び、まだ始まったばかり

私は似た何かをする時にそれを行うが、メッセージへのcharの古いメッセージを追加するチャット

messages.addAll(0, oldMessages); 

mAdapter.notifyItemRangeInserted(0, oldMessages.size()); 
mAdapter.notifyItemChanged(oldMessages.size()); 
mAdapter.setLoaded(); 

イムとして働いて、逆転しました。

は、その後、私は私が最初

+0

フィードバックに感謝 –