Android: ListView elements with multiple clickable buttons

后端 未结 8 1112
天命终不由人
天命终不由人 2020-11-22 01:58

I\'ve a ListView where every element in the list contains a TextView and two different Buttons. Something like this:

ListView
------------------         


        
相关标签:
8条回答
  • 2020-11-22 02:09

    Probably you've found how to do it, but you can call

    ListView.setItemsCanFocus(true)
    

    and now your buttons will catch focus

    0 讨论(0)
  • 2020-11-22 02:16

    The solution to this is actually easier than I thought. You can simply add in your custom adapter's getView() method a setOnClickListener() for the buttons you're using.

    Any data associated with the button has to be added with myButton.setTag() in the getView() and can be accessed in the onClickListener via view.getTag()

    I posted a detailed solution on my blog as a tutorial.

    0 讨论(0)
  • 2020-11-22 02:18

    I don't have much experience than above users but I faced this same issue and I Solved this with below Solution

    <Button
            android:id="@+id/btnRemove"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/btnEdit"
            android:layout_weight="1"
            android:background="@drawable/btn"
            android:text="@string/remove" 
            android:onClick="btnRemoveClick"
            />
    

    btnRemoveClick Click event

    public void btnRemoveClick(View v)
    {
        final int position = listviewItem.getPositionForView((View) v.getParent()); 
        listItem.remove(position);
        ItemAdapter.notifyDataSetChanged();
    
    }
    
    0 讨论(0)
  • 2020-11-22 02:21

    Isn't the platform solution for this implementation to use a context menu that shows on a long press?

    Is the question author aware of context menus? Stacking up buttons in a listview has performance implications, will clutter your UI and violate the recommended UI design for the platform.

    On the flipside; context menus - by nature of not having a passive representation - are not obvious to the end user. Consider documenting the behaviour?

    This guide should give you a good start.

    http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/

    0 讨论(0)
  • 2020-11-22 02:22

    This is sort of an appendage @znq's answer...

    There are many cases where you want to know the row position for a clicked item AND you want to know which view in the row was tapped. This is going to be a lot more important in tablet UIs.

    You can do this with the following custom adapter:

    private static class CustomCursorAdapter extends CursorAdapter {
    
        protected ListView mListView;
    
        protected static class RowViewHolder {
            public TextView mTitle;
            public TextView mText;
        }
    
        public CustomCursorAdapter(Activity activity) {
            super();
            mListView = activity.getListView();
        }
    
        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            // do what you need to do
        }
    
        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            View view = View.inflate(context, R.layout.row_layout, null);
    
            RowViewHolder holder = new RowViewHolder();
            holder.mTitle = (TextView) view.findViewById(R.id.Title);
            holder.mText = (TextView) view.findViewById(R.id.Text);
    
            holder.mTitle.setOnClickListener(mOnTitleClickListener);
            holder.mText.setOnClickListener(mOnTextClickListener);
    
            view.setTag(holder);
    
            return view;
        }
    
        private OnClickListener mOnTitleClickListener = new OnClickListener() {
            @Override
            public void onClick(View v) {
                final int position = mListView.getPositionForView((View) v.getParent());
                Log.v(TAG, "Title clicked, row %d", position);
            }
        };
    
        private OnClickListener mOnTextClickListener = new OnClickListener() {
            @Override
            public void onClick(View v) {
                final int position = mListView.getPositionForView((View) v.getParent());
                Log.v(TAG, "Text clicked, row %d", position);
            }
        };
    }
    
    0 讨论(0)
  • 2020-11-22 02:24

    For future readers:

    To select manually the buttons with the trackball use:

    myListView.setItemsCanFocus(true);
    

    And to disable the focus on the whole list items:

    myListView.setFocusable(false);
    myListView.setFocusableInTouchMode(false);
    myListView.setClickable(false);
    

    It works fine for me, I can click on buttons with touchscreen and also alows focus an click using keypad

    0 讨论(0)
提交回复
热议问题