根据设备格式更改 LayoutManager
Change LayoutManager depending on device format
我有一个带有卡片列表的 RecyclerView。我想知道在使用 phone 时是否可以将 RecyclerView 的 LayoutManager 更改为线性,而在使用平板电脑时是否可以通过编程方式将其更改为 StaggeredGrid。
我最初的想法是在 Activity 上使用相同的代码,只更改 layout.xml,但考虑到 Android 使用不同的 LayoutManagers,这似乎并不复杂。
我也尝试过使用 Cardslib 库,但是 reeeeaally 被文档弄糊涂了,因为没有自定义卡片的完整示例。
有什么想法吗?
是的,这是可能的。一种解决方案是在您的值文件夹中定义一个布尔资源。例如,您可以定义:
<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.
}
因此,正如我告诉@androholic 的那样,我想弄清楚的是如何根据设备格式更改布局。这样,无论何时在平板电脑上加载应用程序,都会显示一个网格,在手机上显示一个列表。
但是,为了使用 RecyclerView 执行此操作,需要两个 LayouManager:用于列表的 LinearLayoutManager 和 Staggered/GridLayoutManager,使代码稍微复杂一些。
我做了什么:
我在一般情况下使用了 GridLayoutManager。我会根据屏幕大小更改的只是列数。这样,一个列表将是一个 RecyclerView 和一个具有 1 列的 GridLayoutManager,而一个网格将有不止一个。就我而言,我只使用 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 上的方法几乎相同。
希望这会消除对我的问题是什么(我意识到我的措辞不是最好的)以及我所取得的成就的任何疑问。
我有一个带有卡片列表的 RecyclerView。我想知道在使用 phone 时是否可以将 RecyclerView 的 LayoutManager 更改为线性,而在使用平板电脑时是否可以通过编程方式将其更改为 StaggeredGrid。 我最初的想法是在 Activity 上使用相同的代码,只更改 layout.xml,但考虑到 Android 使用不同的 LayoutManagers,这似乎并不复杂。 我也尝试过使用 Cardslib 库,但是 reeeeaally 被文档弄糊涂了,因为没有自定义卡片的完整示例。 有什么想法吗?
是的,这是可能的。一种解决方案是在您的值文件夹中定义一个布尔资源。例如,您可以定义:
<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.
}
因此,正如我告诉@androholic 的那样,我想弄清楚的是如何根据设备格式更改布局。这样,无论何时在平板电脑上加载应用程序,都会显示一个网格,在手机上显示一个列表。 但是,为了使用 RecyclerView 执行此操作,需要两个 LayouManager:用于列表的 LinearLayoutManager 和 Staggered/GridLayoutManager,使代码稍微复杂一些。
我做了什么: 我在一般情况下使用了 GridLayoutManager。我会根据屏幕大小更改的只是列数。这样,一个列表将是一个 RecyclerView 和一个具有 1 列的 GridLayoutManager,而一个网格将有不止一个。就我而言,我只使用 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