操作栏列表导航宽度 - 换行内容

时间:2013-02-05 16:53:38

标签: android android-layout android-actionbar

默认情况下,在操作栏列表中,所选项目的导航宽度与最宽项目一样宽。我想在所选项目中“wrap_content”,因为它在google +,gmail,map android apps。

有人知道这么热吗?

我试图覆盖导航适配器的getView但它不起作用。它看起来这个视图被包含在另一个视图中,该视图的宽度最宽。我也尝试了带有微调器的actionbar.setCustom视图,但是微调器的行为是相同的。它使用最宽的项目宽度。

感谢所有建议,链接和帮助。

Current state

Required state

4 个答案:

答案 0 :(得分:13)

我遇到了同样的问题。似乎Android会为所有项目调用getView()方法,最后将宽度设置为最宽项目的宽度。

所以这是我的解决方案:

  1. 在您的代码中存储当前选定的部分(例如您的示例中的部分),例如selectedSection。实际上你必须在NavigationListener的onNavigationItemSelected()方法中这样做。

  2. 覆盖SpinnerAdapter的getView()方法,始终将其内容设置为selectedSection。

  3. 在NavigationListener的onNavigationItemSelected()方法中,在将当前模式设置为selectedSection后,尝试调用spinnerAdapter的notifyDataSetChanged()方法。

  4. 以下是示例代码:

    final int selectedSection = 0;
    final String sectionLabels[] = {"short sec", "long section", "looooonger section"};
    
    final ArrayAdapter<String> arrayAdapter =
      new arrayAdapter<String>(this, simple_list_item_1) {
        @Override
        public int getCount() {
          // You need to implement here.
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
          if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.you_entry, null);
          }
          TextView textView = (TextView) convertView.findViewById(R.id.you_text);
          // Set the text to the current section.
          textView.setText(sectionLabels[selectedSection]);
        }
    
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
          // You need to implement here.
        }
    
      }
    
    actionBar.setListNavigationCallbacks(navigationAdpater,
      new ActionBar.OnNavigationListener() {
    
        @Override
        public boolean onNavigationItemSelected(int itemPosition, long itemId) {
          // Store the current section.
          selectedSection = itemPosition;
          navigationAdpater.notifyDataSetChanged();
          return true;
        }
      });
    

答案 1 :(得分:3)

您需要覆盖适配器中的getView()方法,并将布局参数设置为textview以包装内容。微调器将自动调整所选项目的大小。

我从ArrayAdapter创建了一个自定义适配器:

public class CustomAdapter extends ArrayAdapter<String> {

之后我重写了getView()方法,改变了当前视图的LayoutParams:

@Override 
public View getView(final int position, final View convertView, final ViewGroup parent) {
            View view = convertView;
            if (null == view) {
                view = LayoutInflater.from(this.getContext())
                         .inflate(android.R.layout.simple_list_item1, null);
                ((TextView) view).setText(getItem(position));
            }
            final LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
                                               LayoutParams.WRAP_CONTENT);
            view.setLayoutParams(params);
            return view;
}

在您的活动中,创建适配器实例并使用它设置微调器:

List<String> stringList = new ArrayList<String>();
stringList.add("test1");
stringList.add("test12");
stringList.add("test123");
stringList.add("test1234");

final SpinnerAdapter adapter = new CustomAdapter(this.getContext(),
                                                 android.R.layout.simple_list_item1,
                                                 android.R.id.text1, 
                                                 stringList);
mySpinner.setAdapter(adapter);

当您在列表中选择某些内容时,微调器将重新创建视图,将所选项重新排序到第一个位置,并将其自身调整为内容的大小。

答案 2 :(得分:0)

创建微调器并为其添加textview。在微调器上将maxWidth字段设置为您想要的任何值,并将处理此值。另一种选择是设置

android:layout_width="0"
android_layout_weight="0.3"

这意味着微调器只占scrren宽度的1/3。

在textview上设置:

android:singleLine="false"
android:ellipsize="end"

答案 3 :(得分:0)

这对我有用。重要的是这个。将上面的代码放在你的适配器上,并使用selectedItemPosition从objects数组中选择文本。

int selectedItemPosition = position;
    if (parent instanceof AdapterView) {
        selectedItemPosition = ((AdapterView) parent)
                .getSelectedItemPosition();
    }

示例如下。

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = getLayoutInflater();
    final View spinnerCell;
    if (convertView == null) {
        // if it's not recycled, inflate it from layout
        spinnerCell = inflater.inflate(R.layout.layout_spinner_cell, parent, false);
    } else {
        spinnerCell = convertView;
    }
    int selectedItemPosition = position;
    if (parent instanceof AdapterView) {
        selectedItemPosition = ((AdapterView) parent)
                .getSelectedItemPosition();
    }

    TextView title = (TextView) spinnerCell.findViewById(R.id.spinnerTitle);
    title.setText(titles[selectedItemPosition]);
    return spinnerCell;
}

如果您需要说明,请点击此链接:http://coding-thoughts.blogspot.in/2013/11/help-my-spinner-is-too-wide.html