複数のフィード アイテムを含むニュースフィード タイプのレイアウトを実装しようとしています。ニュースフィード アイテムは、折りたたまれたときに特定のレイアウトになり、アイテムがクリックされると、このレイアウトは「展開された」バージョンに置き換えられます。
カスタム項目の ListView を使用してこれを実現しました。カスタム アイテムの XML レイアウト ファイルには、レイアウトを前後に変更するために使用した ViewStub があります。ただし、レイアウトを RecyclerView に「移行」し、ViewHolder のデザイン パターンにも従いたいと思いました。後者は私が最初に試したもので、あらゆる種類の問題に遭遇しています。
私のアプローチは次のとおりです。
折りたたまれたレイアウト (events_list_item_content) と展開されたレイアウト (events_list_item_selected_content) への参照を取得します。
ViewStub レイアウト (view_stub_layout) として設定する単純なレイアウト リソース ファイルへの参照を取得します。
ViewStub 参照を取得し、そのレイアウト (view_stub_layout) をインフレートに設定し、折りたたまれたレイアウト ビューをこのレイアウトに追加します (最初にフィードを作成するとき、その項目はすべて折りたたまれます)。
(初期化後、アイテムがクリックされたとき) ViewStubLayout から前のビュー (レイアウト) を削除し、別のタイプのレイアウトを追加します。
これが私のカスタムアダプタークラスです:
public class FeedRecyclerAdapter extends BaseAdapter {
public class ViewHolder {
View inflatedViewStub1;
ViewStub viewStub;
LinearLayout viewStubLayout;
LinearLayout listItemContent, listItemContentSelected;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null)
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final FeedItem item = feedItems.get(position);
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.events_list_item_content_new_container, parent, false);
View view = null;
view = inflater.inflate(R.layout.events_list_item_content, null);
viewHolder.listItemContent = (LinearLayout) view.findViewById(R.id.events_list_item_content);
view = inflater.inflate(R.layout.events_list_item_selected_content, null);
viewHolder.listItemContentSelected = (LinearLayout) view.findViewById(R.id.events_list_item_content_selected);
view = inflater.inflate(R.layout.view_stub_layout, null);
viewHolder.viewStubLayout = (LinearLayout) view.findViewById(R.id.view_stub_layout);
viewHolder.viewStub = (ViewStub) convertView.findViewById(R.id.list_item_feed);
(viewHolder.viewStubLayout).addView(viewHolder.listItemContent);
viewHolder.viewStub.setLayoutResource(R.layout.view_stub_layout);
viewHolder.inflatedViewStub1 = viewHolder.viewStub.inflate();
convertView.setTag(viewHolder);
} else viewHolder = (ViewHolder) convertView.getTag();
if (item.getExploded()) {
viewHolder.viewStubLayout.removeAllViews();
viewHolder.viewStubLayout.addView(viewHolder.listItemContentSelected);
} else {
viewHolder.viewStubLayout.removeAllViews();
viewHolder.viewStubLayout.addView(viewHolder.listItemContent);
}
return convertView;
}
ただし、テストすると、ニュースフィードが表示されるはずのページが空白になります。