【问题标题】:Change LayoutManager depending on device format根据设备格式更改 LayoutManager
【发布时间】:2016-02-06 05:05:04
【问题描述】:

我有一个带有卡片列表的 RecyclerView。我想知道是否可以在使用手机时将 RecyclerView 的 LayoutManager 更改为 Linear,在使用平板电脑时以编程方式将 StaggeredGrid 更改为。 我最初的想法是在 Activity 上使用相同的代码,只更改 layout.xml,但鉴于 Android 使用不同的 LayoutManager,它似乎比这复杂。 我也尝试使用 Cardslib 库,但文档让 reeeaally 感到困惑,因为没有完整的自定义卡片示例。 有什么想法吗?

【问题讨论】:

    标签: android android-recyclerview android-cardview linearlayoutmanager


    【解决方案1】:

    是的,这是可能的。一种解决方案是在您的 values 文件夹中定义一个布尔资源。例如,您可以定义:

    <bool name="is_phone">true</bool>
    

    在您的 values 文件夹以及您的 values-sw720dp 和 values-sw600dp 中添加相同的资源并添加一个 false。

    <bool name="is_phone">false</bool>
    

    然后,在您的 Activity 的 onCreate() 中,您可以这样做:

        boolean isPhone = getResources().getBoolean(R.bool.is_phone);
    
        if (isPhone) {
            // Set linearlayoutmanager for your recyclerview.
        } else {
            // Set staggeredgridlayoutmanager for your recyclerview.
        }
    

    【讨论】:

    • 这只是部分答案。我想出的是使用相同的 LayoutManager(网格之一),并根据设备更改列。因此,如果我有手机,则显示相同的网格,但只显示一列(实际上是制作列表而不是网格),如果是平板电脑,则显示更多列。当我找到一些时间时,我会相应地写下答案。编辑:忘了说谢谢,所以,谢谢!
    【解决方案2】:

    所以,正如我告诉@androholic 的那样,我想弄清楚的是如何根据设备格式改变布局。这样,每当在平板电脑上加载应用程序时,就会显示一个网格,并在手机上显示一个列表。 但是,为了使用 RecyclerView 执行此操作,需要两个 LayouManager:用于列表的 LinearLayoutManager 和 Staggered/GridLayoutManager,这使得代码更加复杂。

    我做了什么: 对于一般情况,我使用了 GridLayoutManager。我会根据屏幕大小改变的只是列数。这样,一个列表将是一个 RecyclerView 与一个 GridLayoutManager 与 1 列,并且一个网格将有多个。就我而言,我只使用 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 上的方法几乎相同。 希望这将消除对我的问题是什么(我意识到我的措辞不是最好的)以及我所取得的成就的任何疑问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-12
      • 2011-03-18
      • 1970-01-01
      • 2021-12-18
      • 2020-08-21
      • 2012-12-16
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多