2017-02-05 1 views
0

私は以下の質問に記載されているのとほぼ同じ問題があります。私は改造を使用していると思います。データをspaceDecoratorメソッドに渡したいので、設定が変更または更新されるたびに余分なスペースが追加されます。アイテムデコレータは余分なスペースを追加し、呼び出されるたびにこの問題をどのように処理するのですか?

RecyclerView decorator adding extra padding on refresh

私はすべてのソリューションは、上記の提案を試みたが、うまくいきませんでした。この問題を処理する方法を提案してください。

マイコード:

public class MainActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 

    public static final String top_rated = "http://api.themoviedb.org/3/movie/top_rated?api_key=1401a8cfe672a592a1a72b023d9febd7"; 

    public static final String popular = "http://api.themoviedb.org/3/movie/popular?api_key=1401a8cfe672a592a1a72b023d9febd7"; 

    public static final String baseUrl = "http://api.themoviedb.org/3/"; 

    public static final String apiKEy = "1401a8cfe672a592a1a72b023d9febd7"; 

    public static final String preUrl = "http://image.tmdb.org/t/p/w342"; 

    public static List<MovieData> movieDataList; 

    private static SpaceDecorator spaceDecorator; 

    private RecyclerView recyclerView; 
    private RecyclerView.Adapter adapter; 
    private RecyclerView.LayoutManager layoutManager; 
    private ProgressDialog mProgressDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar myToolbar = (Toolbar) findViewById(R.id.main_toolbar); 
     setSupportActionBar(myToolbar); 

     recyclerView = (RecyclerView)findViewById(R.id.main_recyclerview); 
     recyclerView.setHasFixedSize(true); 
     layoutManager = new GridLayoutManager(MainActivity.this,2); 
     recyclerView.setLayoutManager(layoutManager); 

     //use a layout manager, a grid layout manager with 2 columns in our case 

     updateJson(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if(item.getItemId() == R.id.action_settings){ 
      startActivity(new Intent(this, SettingsActivity.class)); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 


    private void updateJson(){ 
     mProgressDialog = new ProgressDialog(MainActivity.this); 
     mProgressDialog.setIndeterminate(true); 
     mProgressDialog.setMessage("Loading..."); 
     mProgressDialog.show(); 

     Retrofit retrofit = new Retrofit.Builder() 
          .baseUrl(baseUrl) 
          .addConverterFactory(GsonConverterFactory.create()) 
          .build(); 
     final RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
     String sort_by = sharedPreferences.getString("sort_by","popular"); 

     Call<JsonMovieResponse> call = requestInterface.getTopRatedMovies(sort_by, apiKEy); 
     call.enqueue(new Callback<JsonMovieResponse>() { 

      @Override 
      public void onResponse(Call<JsonMovieResponse> call, Response<JsonMovieResponse> response) { 

       movieDataList = response.body().getResults(); 
       adapter = new MainRecyclerViewAdapter(MainActivity.this, movieDataList); 
       recyclerView.setAdapter(adapter); 
       spaceDecorator = new SpaceDecorator(4,adapter.getItemCount()); 
       recyclerView.addItemDecoration(spaceDecorator); 

       if(mProgressDialog.isShowing()) 
        mProgressDialog.dismiss(); 
      } 

      @Override 
      public void onFailure(Call<JsonMovieResponse> call, Throwable t) { 
       Log.e("retrofit error", t.toString()); 
      } 
     }); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     PreferenceManager.getDefaultSharedPreferences(this). 
       unregisterOnSharedPreferenceChangeListener(this); 
     Log.i("main","destroy"); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     PreferenceManager.getDefaultSharedPreferences(this). 
       registerOnSharedPreferenceChangeListener(this); 
     Log.i("activity","main resume"); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { 
     Log.i("main settings", "changed"); 
     updateJson(); 
    } 
} 
+0

同じ問題はありますが、同じコードではない場合があります。関連するすべての部分を追加してください。 – tynn

+0

関連するコードを投稿してください。 – Alex

+0

コードを追加しました – potter13

答えて

3

があなたのspaceDecoratorなどのアイテムの装飾を追加wehreあなたonResponse()方法を考えてみましょう。このメソッドは加法的なので、更新するたびにアイテム間にスペースを追加します。代わりに、新しいものを追加する前に古いspaceDecoratorを削除する必要があります。

@Override 
public void onResponse(Call<JsonMovieResponse> call, Response<JsonMovieResponse> response) { 

    movieDataList = response.body().getResults(); 
    adapter = new MainRecyclerViewAdapter(MainActivity.this, movieDataList); 
    recyclerView.setAdapter(adapter); 

    if (spaceDecorator != null) 
     recyclerView.removeItemDecoration(spaceDecorator); 

    spaceDecorator = new SpaceDecorator(4,adapter.getItemCount()); 
    recyclerView.addItemDecoration(spaceDecorator); 

    if(mProgressDialog.isShowing()) 
     mProgressDialog.dismiss(); 
} 
+0

ありがとうございましたitemdecoratorが追加されたかどうかを確認するためにrecycleviewメソッドを探していましたが、そのようなメソッドが利用できるとは思いません – potter13

1

、以下のように追加する前にitemDecorationを削除してみてください:

  movieDataList = response.body().getResults(); 
      adapter = new MainRecyclerViewAdapter(MainActivity.this, movieDataList); 
      recyclerView.setAdapter(adapter); 
      if(spaceDecorator != null){ 
       recyclerView.removeItemDecoration(spaceDecorator); 
      } 
      spaceDecorator = new SpaceDecorator(4,adapter.getItemCount()); 
      recyclerView.addItemDecoration(spaceDecorator); 

      if(mProgressDialog.isShowing()) 
       mProgressDialog.dismiss(); 

あなたはaddItemDecorationメソッドを呼び出すたびに、itemDecorationクラスのonDrawが呼び出されます。その方法では、スペースを追加するために各セルのレイアウトパラメータを使用している場合は、最初に正しいものになります。その後の呼び出しで、セルのレイアウトパラメータを先に取得すると、スペースが追加されます。最初にスペースを取り除き、新しいスペースを追加してください。

希望すると、これが役立ちます。

関連する問題