根据设备格式更改LayoutManager

时间:2016-02-06 05:05:05

标签: android android-recyclerview android-cardview linearlayoutmanager

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

2 个答案:

答案 0 :(得分: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.
    }

答案 1 :(得分:0)

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

我做了什么: 我使用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&#39; s answer几乎相同。 希望这能解决我的问题是什么(我意识到我的措辞不是最好的),以及我所取得的成就。