【问题标题】:Radio button in list view列表视图中的单选按钮
【发布时间】:2011-04-25 06:35:19
【问题描述】:

我在列表视图格式中显示 sting 列表,我使用默认列表视图并使用 simple_list_item_single_choice 放置了一个单选按钮。但这在右侧显示了单选按钮,我想在左侧显示单选按钮。是否可以使用默认列表视图在左侧显示单选按钮

【问题讨论】:

    标签: android


    【解决方案1】:

    simple_list_item_single_choice.xml 使用CheckedTextView

    这里是simple_list_item_single_choice.xml

     <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:gravity="center_vertical"
        android:checkMark="?android:attr/listChoiceIndicatorSingle"
        android:paddingLeft="6dip"
        android:paddingRight="6dip"
       />
    

    您需要根据需要创建自定义 xml 并使用 CheckBox 来实现您的目标 这是你的custom.xml

     <CheckBox
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="fill_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:gravity="center_vertical"
        android:button="?android:attr/listChoiceIndicatorSingle"
        android:paddingLeft="6dip"
        android:paddingRight="6dip"
       />
    

    只需在您的代码中使用custom.xml 代替simple_list_item_single_choice.xml

    希望对你有帮助。

    【讨论】:

    • 谢谢 Tanmay,它的工作,我将单选按钮放在左侧,但我面临的问题是单选按钮和列表视图中的文本都合并在一起。我想将两者分开单选按钮和列表视图中的字符串。这可能吗..??
    • Opps...!!这是由于android:paddingLeft="6dip"..将其删除,请让我知道结果。
    • 是的,伙计,你很棒。我接受你的回答,它工作正常。但是现在,列表视图 onclick 监听器将无法正常工作...为什么会发生这种情况..???
    • 是的,我正在使用 OnItemClickListener,但在我为列表视图执行自定义单选按钮后,侦听器将无法正常工作。每当我单击列表视图时,只有单选按钮变为绿色。单击时列表视图中不会发生任何事情。请让我在哪里做错了。
    • 同时,每当我在列表视图中提供simple_list_item_single_choice 时,onItemClicklistener 正在工作,当我提供自定义单选框时,监听器将无法正常工作。我犯了什么错误..??请指导我。
    【解决方案2】:

    这是不可能的,默认情况下单选按钮在右侧。如果您希望它位于左侧,则应从 SDK 中获取 simple_list_item_single_choice.xml 布局的源代码并进行适当的更改,然后使用此自定义布局而不是默认布局。

    【讨论】:

      【解决方案3】:

      simple_list_item_single_choice 使用 CheckedTextView 类。

      <?xml version="1.0" encoding="utf-8"?>
      <!-- Copyright (C) 2008 The Android Open Source Project
      
           Licensed under the Apache License, Version 2.0 (the "License");
           you may not use this file except in compliance with the License.
           You may obtain a copy of the License at
      
                http://www.apache.org/licenses/LICENSE-2.0
      
           Unless required by applicable law or agreed to in writing, software
           distributed under the License is distributed on an "AS IS" BASIS,
           WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
           See the License for the specific language governing permissions and
           limitations under the License.
      -->
      
      <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@android:id/text1"
          android:layout_width="match_parent"
          android:layout_height="?android:attr/listPreferredItemHeight"
          android:textAppearance="?android:attr/textAppearanceLarge"
          android:gravity="center_vertical"
          android:checkMark="?android:attr/listChoiceIndicatorSingle"
          android:paddingLeft="6dip"
          android:paddingRight="6dip"
      />
      

      CheckedTextView 类是 android.widget 包。

      本课程来源如下。

      /*

       * Copyright (C) 2007 The Android Open Source Project
       *
       * Licensed under the Apache License, Version 2.0 (the "License");
       * you may not use this file except in compliance with the License.
       * You may obtain a copy of the License at
       *
       *      http://www.apache.org/licenses/LICENSE-2.0
       *
       * Unless required by applicable law or agreed to in writing, software
       * distributed under the License is distributed on an "AS IS" BASIS,
       * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       * See the License for the specific language governing permissions and
       * limitations under the License.
       */
      
      package android.widget;
      
      import com.android.internal.R;
      
      import android.content.Context;
      import android.content.res.TypedArray;
      import android.graphics.Canvas;
      import android.graphics.drawable.Drawable;
      import android.util.AttributeSet;
      import android.view.Gravity;
      import android.view.ViewDebug;
      import android.view.accessibility.AccessibilityEvent;
      
      
      /**
       * An extension to TextView that supports the {@link android.widget.Checkable} interface.
       * This is useful when used in a {@link android.widget.ListView ListView} where the it's 
       * {@link android.widget.ListView#setChoiceMode(int) setChoiceMode} has been set to
       * something other than {@link android.widget.ListView#CHOICE_MODE_NONE CHOICE_MODE_NONE}.
       *
       */
      public class CheckedTextView extends TextView implements Checkable {
          private boolean mChecked;
          private int mCheckMarkResource;
          private Drawable mCheckMarkDrawable;
          private int mBasePaddingRight;
          private int mCheckMarkWidth;
      
          private static final int[] CHECKED_STATE_SET = {
              R.attr.state_checked
          };
      
          public CheckedTextView(Context context) {
              this(context, null);
          }
      
          public CheckedTextView(Context context, AttributeSet attrs) {
              this(context, attrs, 0);
          }
      
          public CheckedTextView(Context context, AttributeSet attrs, int defStyle) {
              super(context, attrs, defStyle);
      
              TypedArray a = context.obtainStyledAttributes(attrs,
                      R.styleable.CheckedTextView, defStyle, 0);
      
              Drawable d = a.getDrawable(R.styleable.CheckedTextView_checkMark);
              if (d != null) {
                  setCheckMarkDrawable(d);
              }
      
              boolean checked = a.getBoolean(R.styleable.CheckedTextView_checked, false);
              setChecked(checked);
      
              a.recycle();
          }
      
          public void toggle() {
              setChecked(!mChecked);
          }
      
          @ViewDebug.ExportedProperty
          public boolean isChecked() {
              return mChecked;
          }
      
          /**
           * <p>Changes the checked state of this text view.</p>
           *
           * @param checked true to check the text, false to uncheck it
           */
          public void setChecked(boolean checked) {
              if (mChecked != checked) {
                  mChecked = checked;
                  refreshDrawableState();
              }
          }
      
      
          /**
           * Set the checkmark to a given Drawable, identified by its resourece id. This will be drawn
           * when {@link #isChecked()} is true.
           * 
           * @param resid The Drawable to use for the checkmark.
           */
          public void setCheckMarkDrawable(int resid) {
              if (resid != 0 && resid == mCheckMarkResource) {
                  return;
              }
      
              mCheckMarkResource = resid;
      
              Drawable d = null;
              if (mCheckMarkResource != 0) {
                  d = getResources().getDrawable(mCheckMarkResource);
              }
              setCheckMarkDrawable(d);
          }
      
          /**
           * Set the checkmark to a given Drawable. This will be drawn when {@link #isChecked()} is true.
           *
           * @param d The Drawable to use for the checkmark.
           */
          public void setCheckMarkDrawable(Drawable d) {
              if (mCheckMarkDrawable != null) {
                  mCheckMarkDrawable.setCallback(null);
                  unscheduleDrawable(mCheckMarkDrawable);
              }
              if (d != null) {
                  d.setCallback(this);
                  d.setVisible(getVisibility() == VISIBLE, false);
                  d.setState(CHECKED_STATE_SET);
                  setMinHeight(d.getIntrinsicHeight());
      
                  mCheckMarkWidth = d.getIntrinsicWidth();
                  mPaddingRight = mCheckMarkWidth + mBasePaddingRight;
                  d.setState(getDrawableState());
              } else {
                  mPaddingRight = mBasePaddingRight;
              }
              mCheckMarkDrawable = d;
              requestLayout();
          }
      
          @Override
          public void setPadding(int left, int top, int right, int bottom) {
              super.setPadding(left, top, right, bottom);
              mBasePaddingRight = mPaddingRight;
          }
      
          @Override
          protected void onDraw(Canvas canvas) {
              super.onDraw(canvas);
      
              final Drawable checkMarkDrawable = mCheckMarkDrawable;
              if (checkMarkDrawable != null) {
                  final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;
                  final int height = checkMarkDrawable.getIntrinsicHeight();
      
                  int y = 0;
      
                  switch (verticalGravity) {
                      case Gravity.BOTTOM:
                          y = getHeight() - height;
                          break;
                      case Gravity.CENTER_VERTICAL:
                          y = (getHeight() - height) / 2;
                          break;
                  }
      
                  int right = getWidth();
                  checkMarkDrawable.setBounds(
                          right - mCheckMarkWidth - mBasePaddingRight, 
                          y, 
                          right - mBasePaddingRight, 
                          y + height);
                  checkMarkDrawable.draw(canvas);
              }
          }
      
          @Override
          protected int[] onCreateDrawableState(int extraSpace) {
              final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
              if (isChecked()) {
                  mergeDrawableStates(drawableState, CHECKED_STATE_SET);
              }
              return drawableState;
          }
      
          @Override
          protected void drawableStateChanged() {
              super.drawableStateChanged();
      
              if (mCheckMarkDrawable != null) {
                  int[] myDrawableState = getDrawableState();
      
                  // Set the state of the Drawable
                  mCheckMarkDrawable.setState(myDrawableState);
      
                  invalidate();
              }
          }
      
          @Override
          public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
              boolean populated = super.dispatchPopulateAccessibilityEvent(event);
              if (!populated) {
                  event.setChecked(mChecked);
              }
              return populated;
          }
      }
      

      您正在 onDraw 修改。和 simple_list_item_single_choice.xml 修改。

      例如。

      <**your class(modifyed CheckedTextView)** xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@android:id/text1"
          android:layout_width="match_parent"
          android:layout_height="?android:attr/listPreferredItemHeight"
          android:textAppearance="?android:attr/textAppearanceLarge"
          android:gravity="center_vertical"
          android:checkMark="?android:attr/listChoiceIndicatorSingle"
          android:paddingLeft="6dip"
          android:paddingRight="6dip"
      />
      

      【讨论】:

        猜你喜欢
        • 2018-09-19
        • 2021-04-09
        • 2016-06-17
        • 1970-01-01
        • 1970-01-01
        • 2019-10-15
        • 2014-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多