0

複数のフィード アイテムを含むニュースフィード タイプのレイアウトを実装しようとしています。ニュースフィード アイテムは、折りたたまれたときに特定のレイアウトになり、アイテムがクリックされると、このレイアウトは「展開された」バージョンに置き換えられます。

カスタム項目の ListView を使用してこれを実現しました。カスタム アイテムの XML レイアウト ファイルには、レイアウトを前後に変更するために使用した ViewStub があります。ただし、レイアウトを RecyclerView に「移行」し、ViewHolder のデザイン パターンにも従いたいと思いました。後者は私が最初に試したもので、あらゆる種類の問題に遭遇しています。

私のアプローチは次のとおりです。

  1. 折りたたまれたレイアウト (events_list_item_content) と展開されたレイアウト (events_list_item_selected_content) への参照を取得します。

  2. ViewStub レイアウト (view_stub_layout) として設定する単純なレイアウト リソース ファイルへの参照を取得します。

  3. ViewStub 参照を取得し、そのレイアウト (view_stub_layout) をインフレートに設定し、折りたたまれたレイアウト ビューをこのレイアウトに追加します (最初にフィードを作成するとき、その項目はすべて折りたたまれます)。

  4. (初期化後、アイテムがクリックされたとき) 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;
  }

ただし、テストすると、ニュースフィードが表示されるはずのページが空白になります。

4

1 に答える 1

0
ViewStub stub = (ViewStub) findViewById(R.id.layout_stub);
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
stub.setLayoutResource(layoutId);
stub.inflate(); // inflate 1st layout

ll.removeAllViews(); // remove previous view, add 2nd layout
ll.addView(LayoutInflater.from(context).inflate(secondLayoutId, ll, false));

Android ViewStub はプログラムでレイアウトを変更します

于 2016-09-10T21:57:48.870 に答える