2016-12-08 19 views
0

私は製品のリストを表示しているカタログ製品に取り組んでおり、ユーザーはリストからグリッドへ、またはその逆にビューモードを変更できます。私はRecyclerViewを使ってリストを表示します。 recyclerviewのレイアウトマネージャを変更できましたが、アイテム(xml)のレイアウトを変更できませんでした。ここに私のコードは次のとおりです。recyclerviewのレイアウトを変更

FragmentListProduct.java

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    productData = new JSONArray(); 
    linearLayoutManager = new LinearLayoutManager(fragmentActivity); 
    gridLayoutManager = new GridLayoutManager(fragmentActivity, 2); 

    lpAdapter = new ListProductAdapter(fragmentActivity, true, productData, null, 
      new ListProductAdapter.OnProductClickListener() { 
       @Override 
       public void onProductClick(View v, long id) { 
        Toast.makeText(fragmentActivity, "id:"+id, Toast.LENGTH_SHORT).show(); 
        MainActivity.setIdToRead((int) id); 
        MainActivity.replaceFragment(FragmentListProduct.this, new FragmentViewProduct()); 
       } 
      }); 
    rvProductList = (RecyclerView) mainView.findViewById(R.id.rvProductList); 
    rvProductList.setLayoutManager(gridLayoutManager); 
    rvProductList.setAdapter(lpAdapter); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.list_mode) { 
     if (!listMode) { 
      listMode = true; 
      item.setIcon(R.drawable.grid); 
      rvProductList.setLayoutManager(linearLayoutManager); 
      lpAdapter.setListMode(false); 
      lpAdapter.notifyDataSetChanged(); 
     } else { 
      listMode = false; 
      item.setIcon(R.drawable.list); 
      rvProductList.setLayoutManager(gridLayoutManager); 
      lpAdapter.setListMode(true); 
      lpAdapter.notifyDataSetChanged(); 
     } 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

ListProductAdapter.java

@Override 
public ListProductHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    Log.i("zihad", "onCreateViewHolder()"); 
    View v = LayoutInflater.from(activity).inflate(listMode ? R.layout.list_product_list : R.layout.list_product_grid, parent, false); 
    return new ListProductHolder(v); 
} 

public void setListMode(boolean listMode) { 
    this.listMode = listMode; 
} 

私はrecyclerviewをスクロールすると、Logcatは「12月8日09を言う:38:09.795 8067 -8067 /?I/zihad:onCreateViewHolder() "ただし、アイテムのレイアウトは変更されません。私のコードで何が問題なのですか?これを解決する方法は?

+0

setListModeは、リストモードの値がfalseであり続けるよう、アダプタには影響を与えません。アダプタをリセットし、代わりにlistModeの値をコンストラクタに渡してみてください。 –

+0

静的メソッドを使用して値を渡してレイアウトを変更することもできます。あなたがやっていることは、アダプタのlistModeの値を変更することですが、アダプタオブジェクトは既に渡されており、リサイクラに再度供給されない限り、listModeの値はfalseのままです。お役に立てれば。 –

+0

あなたの前のコメントは正しかった、私は 'rvProductList.setAdapter(lpAdapter); 'を追加するだけです。 – zihadrizkyef

答えて

0

がにrvProductList.setAdapter(lpAdapter);を入れonOptionItemSelected:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.list_mode) { 
     if (!listMode) { 
      listMode = true; 
      item.setIcon(R.drawable.grid); 
      rvProductList.setLayoutManager(linearLayoutManager); 
      lpAdapter.setListMode(false); 
      lpAdapter.notifyDataSetChanged(); 
     } else { 
      listMode = false; 
      item.setIcon(R.drawable.list); 
      rvProductList.setLayoutManager(gridLayoutManager); 
      lpAdapter.setListMode(true); 
      lpAdapter.notifyDataSetChanged(); 
     } 
     rvProductList.setAdapter(lpAdapter); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
関連する問題