我有一个带卡片列表的 RecyclerView。 我想知道是否可能在使用电话时将 RecyclerView 的 LayoutManager 以编程方式更改为线性布局,并在使用平板电脑时更改为瀑布流布局。
我的初始想法是在 Activity 上使用相同的代码,仅更改 layout.xml,但由于 Android 使用不同的 LayoutManagers,因此它似乎不那么简单。
我还尝试使用 Cardslib 库,但是由于没有自定义卡片的完整示例,因此文档使我非常困惑。
有任何想法吗?
是的,这是可能的。一种解决方案是在您的values文件夹中定义一个布尔资源。例如,您可以定义:
<bool name="is_phone">true</bool>
在您的值文件夹中以及您的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.
}
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;
}