3

カードのリストを含む RecyclerView があります。電話を使用する場合は RecyclerView の LayoutManager を Linear に、タブレットを使用する場合は StaggeredGrid にプログラムで変更できるかどうかを知りたいです。私の最初のアイデアは、アクティビティに同じコードを配置し、layout.xml のみを変更することでしたが、Android が異なる LayoutManagers を使用していることを考えると、それよりも複雑ではないようです。また、Cardslib ライブラリを使用してみましたが、カスタム カードの完全な例がないため、ドキュメンテーションに非常に混乱しました何か案は?

4

2 に答える 2

3

はい、可能です。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.
    }
于 2016-02-06T06:18:47.273 に答える
1

だから、@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とほとんど同じです。うまくいけば、これが私の質問が何であったか(私の言葉遣いが最善ではなかったことを認識しています)、および私が達成したことについての疑問を解決するでしょう.

于 2016-02-07T19:39:21.413 に答える