2016-12-01 86 views
0

我使用Retrofit 2.0從我的api檢索數據並使用recyclerView來顯示它。用新數據刷新recyclerView改造

我的主要活動有一個選項卡布局,其中一個選項卡具有recyclerView,並且該選項卡的片段類正在用於檢索數據和更新佈局。

在我的主佈局中,我有一個製作一個帖子的工廠(所有帖子都在片段級別中檢索),並且此工廠具有在主要活動中製作帖子的功能。

那麼當晶圓廠的功能結束並且貼子成功保存在我的數據庫中後,如何刷新佈局?

基本上 用戶點擊晶圓廠>使他的職位>警報對話框關閉> recyclerView應刷新添加的新數據。

我的片段類:

public class PostsRecentTab extends Fragment { 

private static final String TAG = MainActivity.class.getSimpleName(); 

private RecyclerView feedView; 
private ProgressDialog pDialog = MainActivity.pDialog; 
LinearLayoutManager layoutManager; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    final View v = inflater.inflate(R.layout.tab_recent_posts, container, false); 

    pDialog.setCancelable(false); 
    layoutManager = new LinearLayoutManager(this.getContext()); 
    feedView = (RecyclerView) v.findViewById(R.id.feedView); 

    requestData(); 

    return v; 
} 

public void requestData() { 
    SocialHubAPI apiService = ApiClient.getClient().create(SocialHubAPI.class); 

    pDialog.setMessage("Refreshing..."); 
    showDialog(); 

    Call<StatusResponse> call = apiService.getStatuses(); 
    call.enqueue(new Callback<StatusResponse>() { 
     @Override 
     public void onResponse(Call<StatusResponse> call, Response<StatusResponse> response) { 
      int statusCode = response.code(); 
      List<Status> statuses = response.body().getStatuses(); 
      Log.d(TAG, "Status Code: " + statusCode); 
      hideDialog(); 

      updateView(statuses); 

     } 

     @Override 
     public void onFailure(Call<StatusResponse> call, Throwable t) { 
      Log.e(TAG, t.toString()); 
     } 
    }); 
} 

private void updateView(List<Status> statuses) { 

    StatusesAdapter adapter = new StatusesAdapter(statuses, R.layout.feed_item, getContext()); 
    feedView.setLayoutManager(layoutManager); 
    feedView.setAdapter(adapter); 
} 

private void showDialog() { 
    if (!pDialog.isShowing()) 
     pDialog.show(); 
} 

private void hideDialog() { 
    if (pDialog.isShowing()) 
     pDialog.dismiss(); 
} 
} 

我的Fab在點擊:

FloatingActionButton postStatus = (FloatingActionButton) findViewById(R.id.postStatus); 

    postStatus.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(final View view) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
      builder.setTitle("Post Status"); 

      // Set up the input 
      final EditText input = new EditText(MainActivity.this); 
      // Specify the type of input expected; this, for example, sets the input as a password, and will mask the text 
      input.setInputType(InputType.TYPE_CLASS_TEXT); 
      builder.setView(input); 

      // Set up the buttons 
      builder.setPositiveButton("Post", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        postText = input.getText().toString(); 
        processPost(postText, sessionManager.getToken()); 
        Snackbar.make(view, "Status posted!", Snackbar.LENGTH_LONG).show(); 
       } 
      }); 
      builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

      builder.show(); 
     } 
    }); 

的Fab的onClick調用此方法:

protected void processPost(String postText, String token) { 
    SocialHubAPI apiService = ApiClient.getClient().create(SocialHubAPI.class); 

    pDialog.setMessage("Posting..."); 
    showDialog(); 

    final PostRequest postRequest = new PostRequest(); 
    postRequest.setStatus(postText); 

    Call<PostResponse> call = apiService.postStatus(postRequest, token); 
    call.enqueue(new Callback<PostResponse>() { 
     @Override 
     public void onResponse(Call<PostResponse> call, Response<PostResponse> response) { 
      hideDialog(); 
      Toast.makeText(getApplicationContext(), "Status Posted Successfully!", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     public void onFailure(Call<PostResponse> call, Throwable t) { 
      Log.e(TAG, t.toString()); 
     } 
    }); 
} 
+0

使您的晶圓廠看不見,畢竟數據檢索,使晶圓廠可見 – sushildlh

+0

@sushildlh但這將如何幫助我刷新我的回收視圖? –

+0

你的晶圓廠的onclick方法在哪裏? – sushildlh

回答

1

你應該updateView(List<Status> statuses)無效列表,而不是設置的再次適配器。僅在onCreate()中實例化適配器。

這個功能應該是這樣的:

適配器類

public void addNewStatutes(List<Status> statuses) 
{ 
    this.statuses.addAll(statuses); 
    notifyDataSetChanged(); 
} 

另外在onResponse使用EventBus或Rx

adapter.addNewStatutes(statuses) 

,因爲你的觀點可以被摧毀,這種方法可能會崩潰您應用程序。


根據文檔增加了notifyDataSetChanged