カードのリストを含む RecyclerView があります。電話を使用する場合は RecyclerView の LayoutManager を Linear に、タブレットを使用する場合は StaggeredGrid にプログラムで変更できるかどうかを知りたいです。私の最初のアイデアは、アクティビティに同じコードを配置し、layout.xml のみを変更することでしたが、Android が異なる LayoutManagers を使用していることを考えると、それよりも複雑ではないようです。また、Cardslib ライブラリを使用してみましたが、カスタム カードの完全な例がないため、ドキュメンテーションに非常に混乱しました。何か案は?
2 に答える
はい、可能です。1 つの解決策は、values フォルダーにブール値のリソースを定義することです。たとえば、次のように定義できます。
<bool name="is_phone">true</bool>
values フォルダーと、values-sw720dp および values-sw600dp に、同じリソースを false で追加します。
<bool name="is_phone">false</bool>
次に、アクティビティのonCreate()
で、次のことができます。
boolean isPhone = getResources().getBoolean(R.bool.is_phone);
if (isPhone) {
// Set linearlayoutmanager for your recyclerview.
} else {
// Set staggeredgridlayoutmanager for your recyclerview.
}
だから、@androholicに言ったように、私が理解しようとしていたのは、デバイスのフォーマットに応じてレイアウトを変更する方法です. このようにして、アプリがタブレットにロードされるたびにグリッドが表示され、電話ではリストが表示されました。ただし、RecyclerView でこれを行うには、リスト用の LinearLayoutManager と Staggered/GridLayoutManager の 2 つの LayouManager が必要になるため、コードが少し複雑になります。
私がしたこと: 一般的な場合に GridLayoutManager を使用しました。画面サイズに応じて変更するのは、列の数だけです。このように、リストは 1 列の GridLayoutManager を持つ RecyclerView になり、グリッドには複数の列があります。私の場合、2列のみを使用しています。
私のコードは次のとおりです。
public class AppListActivity extends AppCompatActivity {
private ArrayList<App> apps;
private int columns;
private String root = Environment.getExternalStorageDirectory().toString();
private boolean isTablet;
private RecyclerViewAdapter rvadapter;
public static Context context;
private SwipeRefreshLayout swipeContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getApplicationContext();
//CHECK WHETHER THE DEVICE IS A TABLET OR A PHONE
isTablet = getResources().getBoolean(R.bool.isTablet);
if (isTablet()) { //it's a tablet
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
columns = 2;
} else { //it's a phone, not a tablet
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
columns = 1;
}
//SwipeContainer SETUP
//ArrayList and RecyclerView initialization
apps = new ArrayList<App>();
RecyclerView rv = (RecyclerView) findViewById(R.id.recycler_view);
rv.setHasFixedSize(true);
GridLayoutManager gridlm = new GridLayoutManager(getApplicationContext(),columns);
rv.setLayoutManager(gridlm);
rvadapter = new RecyclerViewAdapter(apps);
rv.setAdapter(rvadapter);
}
public boolean isTablet() {
return isTablet;
}
メソッド isTablet は、@androholic のanswerとほとんど同じです。うまくいけば、これが私の質問が何であったか(私の言葉遣いが最善ではなかったことを認識しています)、および私が達成したことについての疑問を解決するでしょう.