【问题标题】:Modify selected item in Numberpicker Android修改 Numberpicker Android 中的选定项目
【发布时间】:2016-05-23 15:22:51
【问题描述】:

我正在尝试想办法实现下一种观点。目前,我试图创建一个 Listview 并让所选项目变大。但我不能让选定的项目总是在我的视野中间。所以现在我正试图用一个数字选择器来解决这个问题。

但我没有找到任何方法来隐藏分隔栏,并使所选项目与视图的其余部分不同。这个想法是在底部图像中得到类似的东西。

【问题讨论】:

    标签: android xml listview numberpicker


    【解决方案1】:

    我认为 ListView 可能比 NumberPicker 更具可配置性。

    你可以做的是使用不同的行布局,取决于它是中间的还是其他的,所以你的 getView(...) 方法看起来像这样:

    public View getView(int position, View convertView, ViewGroup parent) {
        if (position == 1) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.focused_layout, parent, false);
            // Do whatever with this view
    
        } else {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.not_focused_layout, parent, false);
            // Do whatever with this view
    
        }
    
        return convertView;
    }
    

    通过这种方式,您可以自定义 XML 和代码中的两种布局。如果您想要“特殊”项目,您可以通过其他方式更改条件。

    【讨论】:

      【解决方案2】:

      以下是具有自定义显示值的数字选择器:

       final NumberPicker aNumberPicker = new NumberPicker(context);
          List<Integer> ids = getIds();
          aNumberPicker.setMaxValue(ids.size()-1);
          aNumberPicker.setMinValue(0);
          mDisplayedIds = new String[ids.size()];
          for (int i = 0; i < ids.size(); i++) {
              mDisplayedIds[i] = "Nombre"+String.valueOf(ids.get(i)) ;
          }
          aNumberPicker.setDisplayedValues(mDisplayedIds);
          RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(50, 50);
          RelativeLayout.LayoutParams numPickerParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
          numPickerParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
          relativeLayout.setLayoutParams(params);
          relativeLayout.addView(aNumberPicker, numPickerParams);
      

      另外,你可以查看一些像这样的开源库AndroidPicker

      【讨论】:

        【解决方案3】:

        您可以使用 RecyclerView 来实现这一点,其中一个 Holder 用于 Normal Item,一个 Holder 用于 Selected Item。

        在您的 RecyclerView 适配器中

        private static int SELECTED_ITEM_POSITION = 2;
        private static int NORMAL_ITEM = 1;
        private static int SELECTED_ITEM = 2;
        
        @Override
        public int getItemViewType(int position)
        {
            if(position == SELECTED_ITEM_POSITION)
                return SELECTED_ITEM;
            else
                return NORMAL_ITEM;
        }
        
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
        {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            if(viewType == SELECTED_ITEM)
            {
                YourSelectedViewHolder selectedViewHolder = (YourSelectedViewHolder)layoutInflater.inflate(R.layout.selected_item_layout, parent, false);
                return selectedViewHolder;
            }
            else //viewType == NORMAL_ITEM
            {
                YourNormalViewHolder normalViewHolder = (YourNormalViewHolder)layoutInflater.inflate(R.layout.normal_item_layout, parent, false);
                return normalViewHolder;
            }
        }
        

        【讨论】:

          【解决方案4】:

          我想在我的一个项目中实现非常相似的效果,我希望我的回收站视图的中间项目更加突出。 就我而言,该项目仅进行 z 转换以给人一种专注的印象,但结果与您所描述的非常相似。 我会在这里发布我的代码,以防它可以帮助您朝着正确的方向前进:

          //We're on the onCreateView in a fragment here
          mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                  @Override
                  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                      super.onScrolled(recyclerView, dx, dy);
          
                      //First I find the first visible element
                      int firstVisiblePosition = mLayoutManager.findFirstVisibleItemPosition();
          
                      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                          if (firstVisiblePosition != -1) {
                              int lastVisiblePosition = mLayoutManager.findLastVisibleItemPosition();
          
                              int itemHeight = mLayoutManager.getChildAt(0).getMeasuredHeight();
                              int itemTop = mLayoutManager.getChildAt(0).getTop();
          
                              //We use a '+' as itemTop will be negative
                              int delta = itemHeight + itemTop;
          
                              int currentItemToBeFocused = (delta < (itemHeight / 2)) ? 1 : 0;
          
                              //Reset the z-translation of other items to 0
                              for (int i = 0, last = (lastVisiblePosition - firstVisiblePosition); i <= last; ++i) {
                                  if (mLayoutManager.getChildAt(i) != null) {
                                      mLayoutManager.getChildAt(i).setTranslationZ(0);
                                  }
                              }
                              //And set the z-translation of the current "centered" item
                              if (mLayoutManager.getChildAt(currentItemToBeFocused) != null) {
                                  mLayoutManager.getChildAt(currentItemToBeFocused).setTranslationZ(10);
                              }
                          }
                      }
                  }
          
                  @Override
                  public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                      super.onScrollStateChanged(recyclerView, newState);
                  }
              });
          

          【讨论】:

            猜你喜欢
            • 2016-03-24
            • 2015-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-09
            相关资源
            最近更新 更多