Dalam fragmen I'm pengaturan saya GridLayout dengan cara sebagai berikut:
mRecycler.setLayoutManager(baru GridLayoutManager(rootView.getContext(), 2));
Jadi, saya hanya ingin mengubah itu 2
untuk 4
ketika pengguna memutar telepon/tablet. I'telah membaca tentang onConfigurationChanged
dan saya mencoba untuk membuatnya bekerja untuk kasus saya, tetapi isn't akan dengan cara yang benar. Ketika saya memutar telepon saya, aplikasi crash...
Bisakah anda memberitahu saya bagaimana untuk memecahkan masalah ini?
Berikut ini adalah pendekatan saya untuk menemukan solusi, yang tidak bekerja dengan benar:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int orientation = newConfig.orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2));
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4));
}
}
Terima kasih sebelumnya!
Jika anda memiliki lebih dari satu kondisi atau menggunakan nilai di beberapa tempat ini bisa keluar dari tangan cukup cepat. Saya sarankan untuk membuat struktur sebagai berikut:
res
- values
- dimens.xml
- values-land
- dimens.xml
dengan res/values/dimens.xml
menjadi:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="gallery_columns">2</integer>
</resources>
dan res/values-land/dimens.xml
menjadi:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="gallery_columns">4</integer>
</resources>
Dan kode kemudian menjadi (dan selamanya tetap) seperti ini:
final int columns = getResources().getInteger(R.integer.gallery_columns);
mRecycler.setLayoutManager(new GridLayoutManager(mContext, columns));
Anda dapat dengan mudah melihat betapa mudahnya untuk menambahkan cara-cara baru untuk menentukan jumlah kolom, misalnya menggunakan -w500dp
/-w600dp
/-w700dp
folder resource, bukan dari tanah
.
It's ini juga cukup mudah untuk grup folder tersebut menjadi terpisah sumber daya folder dalam kasus anda don't ingin kekacauan anda yang lain (yang lebih relevan) sumber:
android {
sourceSets.main.res.srcDir 'src/main/res-overrides' // add alongside src/main/res
}
Mencoba menangani ini dalam onCreateView metode bukan karena itu akan dipanggil setiap kali ada's perubahan orientasi:
if(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2));
}
else{
mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4));
}
Cara yang lebih kuat untuk menentukan ada. kolom akan menghitung berdasarkan lebar layar dan pada saat runtime. Saya biasanya menggunakan fungsi berikut untuk itu.
public static int calculateNoOfColumns(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
int scalingFactor = 200; // You can vary the value held by the scalingFactor
// variable. The smaller it is the more no. of columns you can display, and the
// larger the value the less no. of columns will be calculated. It is the scaling
// factor to tweak to your needs.
int columnCount = (int) (dpWidth / scalingFactor);
return (columnCount>=2?columnCount:2); // if column no. is less than 2, we still display 2 columns
}
Hal ini lebih dinamis metode untuk secara akurat menghitung ada. kolom ini. Ini akan menjadi lebih adaptif untuk pengguna menyesuaikan ukuran layar tanpa ... baca lebih hanya dua nilai yang mungkin.
NB: Anda dapat memvariasikan nilai yang dimiliki oleh scalingFactor variabel. Kecil itu semakin tidak ada. kolom ini anda dapat menampilkan, dan semakin besar nilai kurang tidak ada. kolom yang akan dihitung. Ini adalah faktor skala untuk men-tweak untuk kebutuhan anda.
Di onCreate () acara anda dapat menggunakan StaggeredGridLayoutManager
mRecyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(
1, //number of grid columns
GridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mStaggeredGridLayoutManager);
Kemudian ketika pengguna memutar screen capture acara, dan mengubah jumlah kolom secara otomatis
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
mStaggeredGridLayoutManager.setSpanCount(1);
} else {
//show in two columns
mStaggeredGridLayoutManager.setSpanCount(2);
}
}
Akhirnya aku penanganan ini pada method onCreate.
private RecyclerView recyclerView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
Configuration orientation = new Configuration();
if(this.recyclerView.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
} else if (this.recyclerView.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
}
connectGetApiData();
}
Itu bekerja dengan sempurna untuk aplikasi saya.
Anda dapat menerapkan metode di recyclerView onMeasure. Pertama, membuat kelas java AutofitRecyclerView
public class AutofitRecyclerView extends RecyclerView {
//private GridLayoutManager manager;
private StaggeredGridLayoutManager manager;
private int columnWidth = -1;
public AutofitRecyclerView(Context context) {
super(context);
init(context, null);
}
public AutofitRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public AutofitRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
if (attrs != null) {
int[] attrsArray = {
android.R.attr.columnWidth
};
TypedArray array = context.obtainStyledAttributes(attrs, attrsArray);
columnWidth = array.getDimensionPixelSize(0, -1);
array.recycle();
}
manager = new StaggeredGridLayoutManager(1, GridLayoutManager.VERTICAL);
setLayoutManager(manager);
}
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
super.onMeasure(widthSpec, heightSpec);
if (columnWidth > 0) {
int spanCount = Math.max(1, getMeasuredWidth() / columnWidth);
manager.setSpanCount(spanCount);
}
}}
Di xlm tata letak file activity_main.xml
<yourpackagename.AutofitRecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="@dimen/column_width"
android:clipToPadding="false"/>
Kemudian menetapkan variabel dengan lebar masing-masing item dalam file ukuran nilai-nilai folder values/dimens.xml
<resources>
<dimen name="column_width">250dp</dimen>
</resources>
Hal ini dapat untuk resolusi layar yang berbeda values-xxhdpi/dimens.xml
<resources>
<dimen name="column_width">280dp</dimen>
</resources>
Dalam aktivitas anda di event onCreate letakkan kode berikut
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.addItemDecoration(new MarginDecoration(this));
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(new NumberedAdapter(50));
}