代码之家  ›  专栏  ›  技术社区  ›  CodeFusionMobile

如何实现带有按钮的自定义listview行?

  •  1
  • CodeFusionMobile  · 技术社区  · 14 年前

    ExpandableListView 我想用类型的自定义视图填充 NoteView . 注释视图 扩展LinearLayout并包含两个按钮和一个复选框。我几乎所有的东西都在工作 注释视图 的中正在填充备份数据,列表正在填充,按钮可单击并执行所需的任务。

    多级列表 不再响应单击/长单击/按键事件(使用trackball/DPAD选择列表项除外)。

    我用一个标准的TextView替换了我的自定义视图,并且触摸事件再次正常地流动,所以几乎可以肯定的是,我的自定义视图或者我正在忽略的一些模糊的ListView设置有问题。

    这是我的NoteView代码和XML布局。我错过了什么?

    //Custom Note View
    public class NoteView extends LinearLayout{
    
        private CheckBox mCheckBox;
        private TextView mTitleTextView;
        private TextView mDetailsTextView;
        private TextView mDetailsRightTextView;
        private LinearLayout mButtonLayout;
        private Button mDeleteButton;
        private Button mEditButton;
    
        //data storage
        private long mNoteId = -1;
        private boolean mStretched = false;
        private CharSequence mDetails = "";
        private CharSequence mStretchedDetails = "";
        private CharSequence mDetailsRight = "";
        private CharSequence mStretchedDetailsRight = "";       
    
    
        private NoteView.OnNoteButtonClickedListener mEditNoteListener;
        private NoteView.OnNoteButtonClickedListener mDeleteNoteListener;
        private NoteView.OnNoteCheckBoxClickedListener mCheckboxListener;
    
        public NoteView(Context context) {
            super(context);
            init(context);
        }
    
        public NoteView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
    
    
        private void init(Context context) {
    
            this.setPadding(0, 0, 5, 0);
            this.setOrientation(LinearLayout.VERTICAL);
    
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            inflater.inflate(R.layout.noteview_layout, this);//returns the noteview itself, since is parent
    
            //get views
            mCheckBox = (CheckBox) findViewById(R.id.noteViewCB);
            mTitleTextView = (TextView) findViewById(R.id.noteViewTitle);
            mDetailsRightTextView = (TextView) findViewById(R.id.noteViewDetailsRight);
            mDetailsTextView =  (TextView) findViewById(R.id.noteViewDetails);
    
    
            mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(mCheckboxListener != null)
                    {
                        mCheckboxListener.onNoteCheckBoxClicked(mNoteId, isChecked);
                    }
                }
            });
    
            //prepare button layout
            mButtonLayout = (LinearLayout) findViewById(R.id.noteViewButtonLayout);
            mEditButton = (Button) findViewById(R.id.noteViewEditButton);
            mDeleteButton = (Button) findViewById(R.id.noteViewDeleteButton);
    
    
            mEditButton.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    if(mEditNoteListener != null)
                    {
                        mEditNoteListener.onNoteButtonClicked(mNoteId);
                    }
                }
            });
    
            mDeleteButton.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    if(mDeleteNoteListener != null)
                    {
                        mDeleteNoteListener.onNoteButtonClicked(mNoteId);
                    }
                }
            });
    
        }
    
        public void setOnEditClickedListener(NoteView.OnNoteButtonClickedListener listener)
        {
            mEditNoteListener = listener;
        }
    
        public void setOnDeleteClickedListener(NoteView.OnNoteButtonClickedListener listener)
        {
            mDeleteNoteListener = listener;
        }
    
    
        public void setOnCheckboxClickedListener(NoteView.OnNoteCheckBoxClickedListener listener)
        {
            mCheckboxListener = listener;
        }
    
        static abstract class OnNoteButtonClickedListener
        {
            public abstract void onNoteButtonClicked(long noteId);
        }
    
    
        static abstract class OnNoteCheckBoxClickedListener
        {
            public abstract void onNoteCheckBoxClicked(long noteId, boolean checked);
        }
    
    
        public void setNoteId(long noteId)
        {
            mNoteId = noteId;   
        }
    
        public long getNoteId()
        {
            return mNoteId;
        }
    
        public void setTitle(CharSequence title)
        {
            mTitleTextView.setText(title);
        }
    
        public void setChecked(boolean checked)
        {
            mCheckBox.setChecked(checked);
        }
    
        public boolean isChecked()
        {
            return mCheckBox.isChecked();
        }
    
        public void setDetails(CharSequence details, CharSequence stretchedDetails)
        {
            if(details == null || details.length() == 0)
            {
                mDetails = "";
            }else
            {
                mDetails = details;
            }
    
            if(stretchedDetails == null)
            {
                mStretchedDetails = "";
            }
            else
            {
                mStretchedDetails = stretchedDetails;
            }
    
            refreshStretched();
        }
    
        public void setDetailsRight(CharSequence detailsRight, CharSequence expandedDetailsRight)
        {
            if(detailsRight == null || detailsRight.length() == 0)
            {
                mDetailsRight = "";
            }else
            {
                mDetailsRight = detailsRight;
            }
    
            if(expandedDetailsRight == null)
            {
                mStretchedDetailsRight = "";
            }
            else
            {
                mStretchedDetailsRight = expandedDetailsRight;
            }
    
            refreshStretched();
        }
    
        public void setStretched(boolean expanded)
        {
            mStretched = expanded;
            refreshStretched();
        }
    
        public boolean getStretched()
        {
            return mStretched;
        }
    
        public boolean toggleStretched()
        {
            setStretched(!getStretched());
            return mStretched;
        }
    
        public void showButtons() {
    
            if(mButtonLayout.getVisibility() != VISIBLE )
            {
                Animation slideIn = AnimationUtils.loadAnimation(this.getContext(), R.anim.slideonfromright);
    
                mButtonLayout.setAnimation(slideIn);
                mButtonLayout.setVisibility(VISIBLE);
                mButtonLayout.startAnimation(slideIn);
            }       
        }
    
        public void hideButtons() {
            if(mButtonLayout != null && mButtonLayout.getVisibility() == VISIBLE )
            {
                Animation slideOut = AnimationUtils.loadAnimation(this.getContext(), R.anim.slideofftoright);
                slideOut.setAnimationListener(new AnimationListener()
                {
                    @Override
                    public void onAnimationEnd(Animation animation) {
                        mButtonLayout.setVisibility(GONE);
                    }
                    @Override
                    public void onAnimationRepeat(Animation animation) {}
                    @Override
                    public void onAnimationStart(Animation animation) { }
                });
    
                mButtonLayout.startAnimation(slideOut);
            }
        }
    
    
        public void hideButtons(boolean noAnimation) {
            mButtonLayout.setVisibility(GONE);
        }
    
        public void refreshStretched() {
    
            if(mStretched)
            {
                mDetailsRightTextView.setText(mStretchedDetailsRight);
                mDetailsTextView.setText(mStretchedDetails);
            }else
            {
                mDetailsRightTextView.setText(mDetailsRight);
                mDetailsTextView.setText(mDetails);
            }
    
            if(mDetailsRightTextView.length() == 0)
            {
    
                mDetailsRightTextView.setVisibility(GONE);
            }else
            {
                mDetailsRightTextView.setVisibility(VISIBLE);
            }
    
            if(mDetailsTextView.length() == 0)
            {
                mDetailsTextView.setVisibility(GONE);
            }else
            {
                mDetailsTextView.setVisibility(VISIBLE);
            }
        }
    }
    

    注释视图_布局.xml

    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android" >
        <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingRight="5dip">
            <CheckBox android:id="@+id/noteViewCB"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
            <TextView android:id="@+id/noteViewTitle"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:text="Title"/>
            <LinearLayout
                    android:id="@+id/noteViewButtonLayout"
                    android:orientation="horizontal"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="5dip"
                    android:visibility="gone"
                    android:layout_gravity="center_vertical">
                <Button android:id="@+id/noteViewEditButton"
                        android:layout_width="80dp"
                        android:layout_height="fill_parent"
                        android:background="@drawable/drawngreenbutton"
                        android:textStyle="bold"
                        android:text="Edit"/>
                <Button android:id="@+id/noteViewDeleteButton"
                        android:layout_width="80dp"
                        android:layout_height="fill_parent"
                        android:background="@drawable/drawnredbutton"
                        android:textStyle="bold"
                        android:text="Delete"/>
            </LinearLayout>
        </LinearLayout>
        <LinearLayout  android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TextView android:id="@+id/noteViewDetails"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:layout_marginRight="10dip"
        android:visibility="gone"
        android:focusable="false"
        android:bufferType="spannable"/>
        <TextView 
        android:id="@+id/noteViewDetailsRight"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:visibility="gone"
        android:focusable="false"
        android:bufferType="spannable"
        android:gravity="right"/></LinearLayout>
    </merge>
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   fpanizza    14 年前

    我遇到过一个类似的问题,当在listview项目布局中使用复选框时会发生。 请检查是否添加属性: 安卓:可调焦=“错误” 复选框定义帮助您:

    <CheckBox android:id="@+id/noteViewCB" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:focusable="false" />
    

    问题似乎是Android不允许您选择具有可聚焦元素的列表项。

    最好的,