4

我正在使用FlexboxLayout在 android 中显示芯片,但卡在 UI 我想在第二行末尾显示芯片数量的地方,如下图所示在此处输入图像描述

根据上述设计,我想在第二行之前显示芯片,不适合第二行的芯片应该增加芯片末尾的芯片数

我检查的是

1- FlexboxLayout setMaxLine(2); 但在这种情况下,用户界面只有两条线绘制,第二条线是拉伸

2- FlexboxLayout getFlexLineInternel() - 这个 API 给出了错误的结果。在行中添加 1 项后行数增加,然后它给出getFlexLineInternel().size() == 2 这意味着视图已经添加到第三行但我只想限制 2 行。

3- 尝试使用 Material Chip 和 ChipGroup - 它没有给我在 chipGroup 中绘制的线数

4-尝试使用类似于ChipGroup的 Flowlayout。没有给我按布局绘制的行数,以便我可以在第二行末尾显示计数

请给我建议什么对我的情况有帮助

这是我的代码

活动搜索标签.xml

<com.google.android.flexbox.FlexboxLayout
      android:id="@+id/assetLabelsContainer"
      android:layout_width="match_parent"
      android:layout_marginLeft="@dimen/size_16"
      android:layout_marginRight="@dimen/size_16"
      android:layout_height="wrap_content"
      app:flexWrap="wrap"/>

标签搜索活动.java

   public class LabelSearchActivity extends SearchActivity {

  @BindView(R.id.assetLabelsContainer)
  public FlexboxLayout assetLabelsContainer;

  private int COUNTER_LABEL_ID = -1;
  private ArrayList<LabelModelParcelableItem> selectedLabels;
  private ArrayList<LabelModelParcelableItem> visibleSelectedList;
  private CompositeDisposable disposables;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ButterKnife.bind(this);
    clearLabelList();
    showSelectedLabel();
  }

  public void hideSearchTitleCountView() {
    if (null != searchTitle) {
      searchTitle.setVisibility(View.GONE);
    }
  }

  private void clearLabelList() {
    selectedLabels = new ArrayList<>();
    visibleSelectedList = new ArrayList<>();
    assetLabelsContainer.getFlexLinesInternal().clear();
    assetLabelsContainer.removeAllViews();
  }

  private void showSelectedLabel() {
    if (getIntent() != null) {
      Bundle bundle = getIntent().getExtras();
      if (bundle.getParcelableArrayList(SELECTED_LABEL_ITEMS) != null) {
        ArrayList<LabelModelParcelableItem> selectedLabels = bundle
            .getParcelableArrayList(SELECTED_LABEL_ITEMS);
        showLabelList(selectedLabels);
      }
    }
  }

  public void addViewToFlex(final LabelModelParcelableItem labelModelParcelableItem) {
    if (!selectedLabels.contains(labelModelParcelableItem)) {
      selectedLabels.add(labelModelParcelableItem);
      final View view = getChipView(labelModelParcelableItem);
      if (shouldShowCount()) {
        View countView = getCounterView();
        if (null != countView) {
          LabelModelParcelableItem tag = (LabelModelParcelableItem) countView.getTag();
          LabelModelParcelableItem updatedTag =
              new LabelModelParcelableItem(
                  tag.getLabelId(), String.valueOf(getInvisibleItemCount()), tag.getAssetCount());
          TextView textView = (TextView) countView.findViewById(R.id.labelNameText);
          textView.setText(" + " + updatedTag.getLabelName());
          countView.setTag(updatedTag);
          assetLabelsContainer.requestLayout();
        } else {
          addCounterView();
        }
      } else {
        visibleSelectedList.add(labelModelParcelableItem);
        assetLabelsContainer.addView(view);
      }
    }
  }

  public int getInvisibleItemCount() {
    ArrayList<LabelModelParcelableItem> itemList = new ArrayList<>(selectedLabels);
    itemList.removeAll(visibleSelectedList);
    return itemList.size();
  }

  private void addCounterView() {
    final View view =
        LayoutInflater.from(LabelSearchActivity.this)
            .inflate(R.layout.label, assetLabelsContainer, false);
    LabelModelParcelableItem item =
        new LabelModelParcelableItem(
            COUNTER_LABEL_ID, String.valueOf(getInvisibleItemCount()), COUNTER_LABEL_ID);
    view.setTag(item);
    TextView textView = (TextView) view.findViewById(R.id.labelNameText);
    textView.setText(" + " + item.getLabelName());
    view.setOnClickListener(v -> showLabelContainerScreen(getSelectedLabels()));
    if (getInvisibleItemCount() > 0) {
      assetLabelsContainer.addView(view);
    }
  }

  public View getChipView(final LabelModelParcelableItem item) {
    final View view =
        LayoutInflater.from(LabelSearchActivity.this)
            .inflate(R.layout.label, assetLabelsContainer, false);
    TextView textView = (TextView) view.findViewById(R.id.labelNameText);
    textView.setText(item.getLabelName());
    view.setOnClickListener(v -> removeViewFormFlex(view, item));
    return view;
  }

  private boolean shouldShowCount() {
    if (assetLabelsContainer.getFlexLinesInternal().size() > 2) {
      return true;
    }
    return false;
  }

  private void updatedLabelAfterRemove() {
    if (null != getCounterView()) {
      if (getInvisibleItemCount() > 0) {
        ArrayList<LabelModelParcelableItem> itemList = new ArrayList<>(selectedLabels);
        itemList.removeAll(visibleSelectedList);
        Collections.sort(itemList, (o1, o2) -> o2.getLabelName().compareTo(o1.getLabelName()));
        if (!itemList.isEmpty()) {
          addViewAfterRemove(itemList.get(0));
        }
      } else {
        assetLabelsContainer.removeView(getCounterView());
      }
    }
  }

  private void addViewAfterRemove(LabelModelParcelableItem item) {
    final View labelView = getChipView(item);
    View countView = getCounterView();
    if (countView != null) {
      assetLabelsContainer.removeView(countView);
      visibleSelectedList.add(item);
      assetLabelsContainer.addView(labelView);
      addCounterView();
    } else {
      visibleSelectedList.add(item);
      assetLabelsContainer.addView(labelView);
    }
  }

  private View getCounterView() {
    View countView =
        assetLabelsContainer.getFlexItemAt(assetLabelsContainer.getFlexItemCount() - 1);
    if (null != countView) {
      LabelModelParcelableItem item = (LabelModelParcelableItem) countView.getTag();
      if (item != null && item.getLabelId() == -1) {
        return countView;
      }
    }
    return null;
  }

  private void showLabelList(ArrayList<LabelModelParcelableItem> selectedLabels) {
    for (LabelModelParcelableItem item : selectedLabels) {
      addViewToFlex(item);
      assetLabelsContainer.post(() -> assetLabelsContainer.requestLayout());
    }
  }

  public void addSelectedLabel(Parcelable label) {
    addViewToFlex((LabelModelParcelableItem) label);
  }

  public ArrayList<LabelModelParcelableItem> getSelectedLabels() {
    return selectedLabels;
  }

  public List<Parcelable> getUpdatedLabelList(List<? extends Parcelable> newParcelableList) {
    if (null != newParcelableList && !newParcelableList.isEmpty()) {
      newParcelableList.removeAll(getSelectedLabels());
      return new ArrayList<>(newParcelableList);
    } else {
      return new ArrayList<>();
    }
  }

  public void labelUpdateList(List dataList) {
    getSearchAdapter().clearAndUpdateList(dataList);
  }

  @Override
  public void onBackButtonPressed() {
    setActivityResult(getSelectedLabels());
  }

  public void setActivityResult(ArrayList<? extends Parcelable> searchableItem) {
    setResult(RESULT_OK, new Intent().putParcelableArrayListExtra(SEARCH_RESULT, searchableItem));
    super.onBackButtonPressed();
  }

  public void addDisposable(Disposable disposable) {
    if (null == disposables) {
      disposables = new CompositeDisposable();
    }
    disposables.add(disposable);
  }

  @Override
  public void onDestroy() {
    if (disposables != null && !disposables.isDisposed()) {
      disposables.clear();
    }
    super.onDestroy();
  }

  private void showLabelContainerScreen(List<? extends Parcelable> labels) {
    Intent intent = new Intent(this, ViewLabelsActivity.class);
    Bundle bundle = new Bundle();
    bundle.putParcelableArrayList(
        LabelSelectionActivity.ARGUMENT_KEY, (ArrayList<? extends Parcelable>) labels);
    intent.putExtras(bundle);
    startActivityForResult(intent, LabelSelectionActivity.VIEW_ALL_LABEL_CODE);
  }

  @Override
  public void onBackPressed() {
    if (!getSelectedLabels().isEmpty()) {
      Intent intent = new Intent();
      intent.putParcelableArrayListExtra(
          SELECTED_LABEL_ITEMS, (ArrayList<? extends Parcelable>) getSelectedLabels());
      setResult(Activity.RESULT_OK, intent);
    } else {
      this.finish();
    }
    super.onBackPressed();
  }

  @OnClick(R.id.navBarBack)
  public void onBackButton() {
    onBackPressed();
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode != LabelSelectionActivity.VIEW_ALL_LABEL_CODE) {
      return;
    }
    if (data == null) {
      return;
    }
    if (resultCode != RESULT_OK) {
      return;
    }
    if (!data.hasExtra(SELECTED_LABEL_ITEMS)) {
      return;
    }
    clearLabelList();
    ArrayList<LabelModelParcelableItem> selectedLabels =
        data.getParcelableArrayListExtra(SELECTED_LABEL_ITEMS);
    showLabelList(selectedLabels);
    updateAfterViewAllLabels(selectedLabels);
  }

  private void updateAfterViewAllLabels(ArrayList<LabelModelParcelableItem> labelsAfterRemoved) {
    ArrayList<LabelModelParcelableItem> listOfRemovedLabels = new ArrayList<>(getSelectedLabels());
    listOfRemovedLabels.removeAll(labelsAfterRemoved);
    for (LabelModelParcelableItem item :  labelsAfterRemoved) {
      //removeViewFormFlex(item);
    }
  }

  public void removeViewFormFlex(View view, LabelModelParcelableItem item) {
    if (selectedLabels.remove(item)) {
      if (selectedLabels.isEmpty()) {
        assetLabelsContainer.removeAllViews();
      } else {
        visibleSelectedList.remove(item);
        assetLabelsContainer.removeView(view);
      }
      updatedLabelAfterRemove();
      Comparator<LabelModelParcelableItem> compareByName =
          (o1, o2) -> o1.getLabelName().compareTo(o2.getLabelName());
      getSearchAdapter().addLabelItemToList(item, compareByName);
    }
  }
}

根据上面的代码,它看起来像下图

在此处输入图像描述

4

1 回答 1

1

尝试测量FlexboxLayout 每个之后的高度,flexboxLayout.addView(view)如果宽度增加,则意味着您在第二行。

于 2019-06-11T13:47:33.350 回答