使用しました。
リストをLISTおよびGRIDとして表示すると、項目のレイアウトが異なります。
リスト内の項目を表示しているときに、行フォーマットが
|----|
|icon| Item Name
|----|
グリッド内のアイテムを表示する場合、行フォーマットはしたがって、私は
I参照リストとして私のリストを表示|--------------|
| large icon |
| |
| |
| |
|--------------|
Item Name
あります
|----|
|icon| Item1
|----|
|----|
|icon| Item2
|----|
|----|
|icon| Item3
|----|
|----|
|icon| Item3
|----|
と私のリストをGRIDとして表示する場合
を参照してください。|--------------| |--------------|
| large icon | | large icon |
| | | |
| | | |
| | | |
|--------------| |--------------|
Item1 Item2
|--------------| |--------------|
| large icon | | large icon |
| | | |
| | | |
| | | |
|--------------| |--------------|
Item3 Item4
リストビューをLISTからGRIDまたはGRIDからLISTに切り替えるときに、一部のビューは他のスタイルのレイアウトでレンダリングされます。私は、切り替える前にあなたが見えないところからスクロールしたビューは再作成されるのではなく、リサイクルされ再利用されると信じています。私はリストにGRIDから行く場合
は、例えば、私は2つのレイアウトマネージャを持つ
|--------------|
| large icon |
|----| | |
|icon| Item1 | |
|----| | |
|--------------|
Item2
|--------------| |--------------|
| large icon | | large icon |
| | | |
| | | |
| | | |
|--------------| |--------------|
Item3 Item4
背景コード情報
を参照してください。各レイアウトスタイルのための1
private RecyclerView.LayoutManager linearLayoutManager;
private RecyclerView.LayoutManager gridLayoutManager;
私はグリッドとしてリストを表示していますかどうかを保存するアダプタで
またはリスト
enum ListViewEnum{
LIST,
GRID
}
ListViewEnum listViewStyle = ListViewEnum.LIST;
public ListViewEnum getListStyle() {
return listViewStyle;
}
リスト内の項目のレイアウトは、リストがされているかどうかによって異なりますリストまたはグリッドとしてレンダリングされます。
ViewHolderList
ViewHolderGrid
ビューホルダーを作成するとき、私はアダプタのリストビュースタイルで表示ホルダーのタイプをベース
protected RecyclerView.ViewHolder getItemViewHolder(ViewGroup parent){
if (listViewStyle == ListViewEnum.LIST){
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row, parent, false);
return new ViewHolderList(itemView, ....);
} else {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_row, parent, false);
return new ViewHolderGrid(itemView, ....);
}
}
ユーザーは、私は、アダプタの値
getListAdapter().setListViewMode(ListViewMode.LIST);
を切り替えるアクションバーのボタンをクリックすると
次に更新します
listView.setLayoutManager(getListAdapter().getListStyle() == ListViewEnum.LIST ? linearLayoutManager : gridLayoutManager);
getListAdapter().notifyDataSetChanged();
listView.invalidateItemDecorations();
invalidateOptionsMenu();
私はリストアダプターをリフレッシュしていますが、recycledViewsは使用できません。デバッグでは、トグルボタンをクリックすると、いくつかの位置(リサイクルされたもの)と "onCreateViewHolder"と "onBindViewHolder"(新しいもの)の呼び出しだけが表示され、古いビューホルダーがリサイクルされていることがわかります。
誤ったリストスタイルからViewHoldersを再利用しないようにリストを更新するにはどうすればよいですか?
、<==>それはviewtypes' '異なるとの区別のカスタム方法を使用して、あなたの要件 – OBX
代わりのを妨げない代わりにrecyclerviewの'をしてみてくださいgetItemViewType() 'ビューのレイアウト中に、同じ関数呼び出しを使用してアイテムのビュータイプが変更されているかどうかを確認するチェックがあることは確かです。これにより、すべてのビューに対して即座に 'onCreateViewHolder()'が実行されます。 – Abbas
Abbas - 素晴らしく、それは完璧に働きました。そして、あなたは、ビュータイプを使用することがこれについて正しい方法であることが完全に理にかなっていることを示唆した後、提案と非常に迅速な返信をありがとうございました。 – se22as