Code Monkey home page Code Monkey logo

recyclerview-multiselect's Introduction

#RecyclerView MultiSelect

RecyclerView MultiSelect is a tool to help implement single or multichoice selection on RecyclerView items. It does not provide the same interface as ListView's setChoiceMode(), but can do everything setChoiceMode() does. It is also small with a limited set of responsibilities, which means it should be suitable for coercing into off label uses.

For more information please see the website.

##Download v0.2 AAR

Gradle

compile 'com.bignerdranch.android:recyclerview-multiselect:0.2'

Maven

<dependency>
	<groupId>com.bignerdranch.android</groupId>
	<artifactId>recyclerview-multiselect</artifactId>
	<version>0.2</version>
</dependency>

##License

The MIT License (MIT)

Copyright (c) 2014 Big Nerd Ranch

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

recyclerview-multiselect's People

Contributors

dgreenhalgh avatar geniusgeek avatar jingibus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

recyclerview-multiselect's Issues

Adding filter functionality to multi-selector

I was trying add a SearchView to filter the results so that I can easily multi-select items from the list. Currently the multi-selection works based on the adapter position which will be changed while filtering. Is there any plan to add this functionality?

Disapearing CardViews + workaround

If a CardView is used as an item it becomes invisible in normal state (not activated). If it is activated it is shown fine - with the accent color. Here's a simple workaround:

A modified function from SwappingHolder with additional parameter which is the background drawable to be used when item is not activated.

private static Drawable getAccentStateDrawable(Context context, Drawable backgroundDrawable) {
TypedValue typedValue = new TypedValue();
Resources.Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.colorAccent, typedValue, true);

    ColorDrawable colorDrawable = new ColorDrawable(typedValue.data);

    StateListDrawable stateListDrawable = new StateListDrawable();
    stateListDrawable.addState(new int[]{android.R.attr.state_activated}, colorDrawable);
    stateListDrawable.addState(StateSet.WILD_CARD, backgroundDrawable); // <- Here we supply backgroundDrawable instead of null

    return stateListDrawable;
}

public ViewHolder(View view) {
super(view, mMultiSelector);
// ...
view.setOnClickListener(this);
view.setOnLongClickListener(this);

        // Call this to override the default state list drawable
        setSelectionModeBackgroundDrawable(getAccentStateDrawable(getActivity(), view.getBackground()));
    }

Leaving selection mode (and action mode) if no item is selected

Hi, thank you for this library, it makes things much easier.

I want to leave selection mode and turn off the action mode bar if the user clicks the only remaining selected item. I've tried doing it like this

  @Override
  public void onClick(View v) {
     if (!mMultiSelector.tapSelection(TaskListViewHolder.this)){
        mPresenter.showBottomSheet(tasks.get(getAdapterPosition()), getAdapterPosition(), true);
     }

     if (mMultiSelector.getSelectedPositions().isEmpty()){
        mMultiSelector.setSelectable(false);
     }
  }

But it doesn't work. The selection mode is turned off, but the action mode bar is not. What's strange is that if I call that outside the view holder, it does work. I implemented it succesfullt in onBackPressed using simply this:

public void leaveSelectMode(){
mMultiSelector.clearSelections();
mMultiSelector.setSelectable(false);
}

but it doesn't work in onClick.

Am i doing something wrong?

Thanks in advance

Error Crash When call multiselector.setselectable(false) after unselect all items in recycleview

I really want to do following feature:
When I select some items, after that, I click on each that item and unselect them. If I unselect last item, means recycleview has no item selected, I want to leave selectable mode, and I use multiselector.setSelectable(false), but app crash with exception:
JNI DETECTED ERROR IN APPLICATION: can't call void android.view.View.setTranslationZ(float) on null object

Please tell me why or how to do my feature? Many thanks, @jingibus

Support per-item selectability

Right now, only all or none items can be set as selectable.

The MultiSelector should not use it's own "mIsSelectable" flag, but the SwappingHolder#isSelectable to decide what happens on a click.

Item ID is never used

In MultiSelector, you're required to pass in a long id for selection (or it is taken from the holder itself using holder.getItemId()). This value is never actually used or saved anywhere. Either it's a bug, or it's unnecessary code.

How to modify/adapt methods from API library?

http://stackoverflow.com/questions/31645655/how-to-modify-adapt-methods-from-api-library

I'm using Big Nerd Ranch's recyclerview-multiselect library to give my RecyclerView's CardViews a multi-selection capability. I've worked out my app-specific kinks for the most part, but I ran into a pretty big issue. Whenever the RecyclerView is in SelectionMode and has to recreate a card (which is often, because that's practically the point of RecyclerView, at least if I understand it correctly,) it throws this error:

java.lang.ClassCastException: android.graphics.drawable.StateListDrawable cannot be cast to android.support.v7.widget.RoundRectDrawableWithShadow
at android.support.v7.widget.CardViewEclairMr1.getShadowBackground(CardViewEclairMr1.java:159)
at android.support.v7.widget.CardViewEclairMr1.getMinWidth(CardViewEclairMr1.java:150)
at android.support.v7.widget.CardView.onMeasure(CardView.java:181)
at android.view.View.measure(View.java:16498)
Logically, I followed the error to whatever source was causing a StateListDrawable to be set as the CardView's background. What I found was summed up by a commented section in this class. It reads as follows:

selectionModeBackgroundDrawable defaults to a StateListDrawable that displays your colorAccent theme color when state_activated=true, and nothing otherwise.

In the SwappingHolder class, you can see where the StateListDrawable, causing the error, is being returned. Also, if you look in the CardViewEclairMr1.java, as suggested in the error, you can see the method that most directly causes the error:

private RoundRectDrawableWithShadow getShadowBackground(CardViewDelegate cardView) {
return ((RoundRectDrawableWithShadow) cardView.getBackground());
}
To be honest, after all this snooping around in the BigNerdRanch library, I'm still not sure what to do! I was thinking I might need to @OverRide the BigNerdRanch methodology which brings in a StateListDrawable, but that would be getting my hands so dirty with the library, it would defeat the purpose of implementing their API to begin with. How do I fix this error?

Leaving select mode causes view to look differently afterwards

Go into single select mode with a long pick.

Select an item in single-select mode. The item signifies that it is selected.

Select an action mode menu item that takes us to another activity. Do that and return.

See that the original view that was selected now looks differently than it originally did.
github1
github 2
github 3

Why does a crash occur when getMultiSelector().clearSelections() is added to onDestroyActionMode?

Overriding the onDestroyActionMode and adding the line getMultiSelector().clearSelections() causes a jni crash. What causes this? Is it fixable? If yes how?

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
            getMultiSelector().clearSelections();
            getMultiSelector().setSelectable(false);
        }

Crash:

10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: can't call void android.view.View.setTranslationZ(float) on null object
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]     in call to CallVoidMethodV
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]     from void android.animation.PropertyValuesHolder.nCallFloatMethod(java.lang.Object, long, float)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65] "main" prio=5 tid=1 Runnable
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   | group="main" sCount=0 dsCount=0 obj=0x86fceef0 self=0xb4d08000
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   | sysTid=26194 nice=0 cgrp=apps sched=0/0 handle=0xb6facec8
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   | state=R schedstat=( 2230607509 883371110 3756 ) utm=160 stm=63 core=3 HZ=100
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   | stack=0xbe02d000-0xbe02f000 stackSize=8MB
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   | held mutexes= "mutator lock"(shared held)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #00 pc 00004c58  /system/lib/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned int, ucontext*)+23)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #01 pc 000034c1  /system/lib/libbacktrace_libc++.so (Backtrace::Unwind(unsigned int, ucontext*)+8)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #02 pc 0025898d  /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::mirror::ArtMethod*)+84)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #03 pc 0023bde3  /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+162)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #04 pc 000b24e5  /system/lib/libart.so (art::JniAbort(char const*, char const*)+620)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #05 pc 000b2c15  /system/lib/libart.so (art::JniAbortF(char const*, char const*, ...)+68)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #06 pc 000b2f2f  /system/lib/libart.so (art::ScopedCheck::CheckVirtualMethod(_jobject*, _jmethodID*)+438)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #07 pc 000be29b  /system/lib/libart.so (art::CheckJNI::CallVoidMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list)+82)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #08 pc 00067897  /system/lib/libandroid_runtime.so (???)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   native: #09 pc 00071ff5  /system/framework/arm/boot.oat (Java_android_animation_PropertyValuesHolder_nCallFloatMethod__Ljava_lang_Object_2JF+132)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.animation.PropertyValuesHolder.nCallFloatMethod(Native method)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.animation.PropertyValuesHolder.access$400(PropertyValuesHolder.java:38)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.animation.PropertyValuesHolder$FloatPropertyValuesHolder.setAnimatedValue(PropertyValuesHolder.java:1296)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.animation.ObjectAnimator.animateValue(ObjectAnimator.java:952)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.animation.ValueAnimator.animationFrame(ValueAnimator.java:1207)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1248)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:659)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.animation.ValueAnimator$AnimationHandler.run(ValueAnimator.java:682)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.view.Choreographer.doCallbacks(Choreographer.java:590)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.view.Choreographer.doFrame(Choreographer.java:559)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.os.Handler.handleCallback(Handler.java:739)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.os.Handler.dispatchMessage(Handler.java:95)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.os.Looper.loop(Looper.java:145)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at android.app.ActivityThread.main(ActivityThread.java:5944)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at java.lang.reflect.Method.invoke!(Native method)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at java.lang.reflect.Method.invoke(Method.java:372)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65]   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)
10-23 01:38:05.291 26194-26194/com.vibhinna.avidd A/art: sart/runtime/check_jni.cc:65] 

ClassCastException is raised when trying to scroll while actionmode is created.

Trace:
1.Long clicked on an item.
2. When I start scrolling the app crashes and below is some part of the crash report.

java.lang.ClassCastException: android.graphics.drawable.StateListDrawable cannot be cast
to android.support.v7.widget.RoundRectDrawableWithShadow
at android.support.v7.widget.CardViewEclairMr1.getShadowBackground(CardViewEclairMr1.java:159)
at android.support.v7.widget.CardViewEclairMr1.getMinWidth(CardViewEclairMr1.java:150)
at android.support.v7.widget.CardView.onMeasure(CardView.java:181)
at android.view.View.measure(View.java:16514)
at android.support.v7.widget.RecyclerView$LayoutManager.measureChildWithMargins(RecyclerView.java:6635)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1385)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1322)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1150)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1007)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1355)
at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2209)
at android.view.View.dispatchTouchEvent(View.java:7706)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2214)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2220)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2220)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2220)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2220)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)

NOTE : I'm using cardview (from android support library itself) as list item of the recycler view.

UPDATE: It doesn't occur frequently on devices running 4.1.2 or on 5.0. It does occur each and every time on my Lenovo a6000 which has 4.4.4.

Library is not AndroidX compatible

Needs to be updated to use the androidX versions of RecyclerView, etc. Current version will compile okay, but doesn't work until this is done.

NoClassDefFoundError: android/animation/StateListAnimator

I receive the following error executing my app in some pre-Lollipop devices (Huawei U9200, Android 4.1.2 API 16; Samsung Galaxy J1, 4.4.4). The same code is working for Lollipop and later versions.

E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NoClassDefFoundError: android/animation/StateListAnimator at java.lang.Class.getDeclaredFields(Native Method) at java.lang.Class.getDeclaredFields(Class.java:647) at dagger.internal.loaders.ReflectiveAtInjectBinding.create(ReflectiveAtInjectBinding.java:151) at dagger.internal.FailoverLoader.getAtInjectBinding(FailoverLoader.java:74) at dagger.internal.Linker.createBinding(Linker.java:224) at dagger.internal.Linker.linkRequested(Linker.java:141) at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:309) at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:279) at s.w.common.App.inject(App.java:36) at s.w.util.InjectionUtils.inject(InjectionUtils.java:16) at s.w.account.cardetails.LicensePlateViewHolder.<init>(LicensePlateViewHolder.java:48) at s.w.account.cardetails.LicensePlateAdapter.onCreateViewHolder(LicensePlateAdapter.java:37) at s.w.account.cardetails.LicensePlateAdapter.onCreateViewHolder(LicensePlateAdapter.java:18) at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5482) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4707) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906) at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283) at android.view.View.layout(View.java:13754) at android.view.ViewGroup.layout(ViewGroup.java:4364) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948) at android.view.View.layout(View.java:13754) at android.view.ViewGroup.layout(ViewGroup.java:4364) at android.widget.FrameLayout.onLayout(FrameLayout.java:448) at android.view.View.layout(View.java:13754) at android.view.ViewGroup.layout(ViewGroup.java:4364) at android.widget.FrameLayout.onLayout(FrameLayout.java:448) at android.view.View.layout(View.java:13754) at android.view.ViewGroup.layout(ViewGroup.java:4364) at android.widget.FrameLayout.onLayout(FrameLayout.java:448) at android.view.View.layout(View.java:13754) at android.view.ViewGroup.layout(ViewGroup.java:4364) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) at android.view.View.layout(View.java:13754) at android.view.ViewGroup.layout(ViewGroup.java:4364) at android.widget.FrameLayout.onLayout(FrameLayout.java:448) at android.view.View.layout(View.java:13754) at android.view.ViewGroup.layout(ViewGroup.java:4364) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1868) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1689) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) at android.view.Choreographer.doCallbacks(Choreographer.java:555) at android.view.Choreographer.doFrame(Choreographer.java:525) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4931) at java.lang.reflect.Method.invokeNative(Native

How can I solve this?

Null Object Reference error in onRebind method.

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.bignerdranch.android.multiselector.MultiSelector.bindHolder(com.bignerdranch.android.multiselector.SelectableHolder, int, long)' on a null object reference
at com.bignerdranch.android.multiselector.MultiSelectorBindingHolder.onRebind(MultiSelectorBindingHolder.java:23)

This happens when i use SwappingHolder.

What might be the reason?

Animation error when leaving ActionMode while items are still selected

Unfortunately, I cannot reproduce this error with the criminalIntent-App. Here are the steps to see the error with my layouts:

  1. LongClick on an list item to get into MultiSelect ActionMode
  2. Select 1 or more items
  3. Leave the ActionMode by pressing back or the up-arrow in the upper-left corner.

When I do so, the ActionMode is destroyed correctly, but the items I selected in step 2 have strange visuals, instead of returning to their original state:

device-2016-09-23-132434

It's a bit better when I override onDestroyActionMode with:

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
            super.onDestroyActionMode(actionMode);
            mAdapter.notifyDataSetChanged();
            mMultiSelector.clearSelections();
        }

With this code added, there is only the elevation left, after leaving the ActionMode:

device-2016-09-23-132708

This is the layout for each list item:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

<LinearLayout
    android:id="@+id/ll_foreground"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="10dp">

    <ImageView
        android:id="@+id/file_list_item_icon"
        android:layout_width="@dimen/list_item_icon_size"
        android:layout_height="@dimen/list_item_icon_size"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="2dip"
        android:contentDescription="@null"
        android:scaleType="centerCrop"/>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:orientation="vertical">

        <TextView
            android:id="@+id/file_list_item_name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="2"
            android:text="@string/app_name"
            android:textColor="@android:color/black"
            android:textSize="@dimen/text_size_medium"/>

        <TextView
            android:id="@+id/file_list_item_modified_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="none"
            android:text="@string/app_name"
            android:textColor="@color/grey_dark"
            android:textSize="@dimen/text_size_small"/>
    </LinearLayout>
</LinearLayout>

<Button
    android:id="@+id/undo_button"
    style="@style/Base.Widget.AppCompat.Button.Borderless"
    android:layout_width="wrap_content"
    android:layout_height="56dp"
    android:layout_gravity="end|center_vertical"
    android:text="@string/undo"
    android:textAllCaps="true"
    android:textColor="@android:color/white"
    />

</FrameLayout>

Do you have any idea where to tackle this? May this be an error in the default statelist animations?

How to implement a selectAll() function?

I am trying to implement a selectAll() function, activate-able through the ActionBar. I was going to try to create a simple for() loop, but because setSelected requires a 'holder' object to work properly, I don't know how I would select any item that isn't being touched independently.

Actionbar showing up black

So far this has made my life a million times easier, thank you so much. The only problem I am having is, whenever the action bar shows up for multi select it is black. I have tried getting it and setting the backgroundDrawable and the stackedBackgroundDrawable but none of them are working. The code is extremely similar to the base tutorial...

private ModalMultiSelectorCallback actionModeCallback = new ModalMultiSelectorCallback(multiSelector) {

        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            super.onCreateActionMode(actionMode, menu);
            getMenuInflater().inflate(R.menu.list_context_menu, menu);
            ActionBar bar = getSupportActionBar();
            bar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.colorPrimaryDarlk)));
            bar.setStackedBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.colorPrimaryDark)));
            return true;
        }

        @Override
        public boolean onActionItemClicked(
                ActionMode mode, MenuItem item
        ) {
            if(item.getItemId() == R.id.delete_items) {
                mode.finish();
                for(int i = multiSelector.getSelectedPositions().size(); i <= 0; i--) {
                    if(multiSelector.isSelected(i, 0)) {
                        adapter.removeNotification(i);
                        recyclerView.getAdapter().notifyItemRemoved(i);
                    }
                }
                multiSelector.clearSelections();
                return true;

            }
            return false;
        }


    };

However even with the calls to setBackgroundDrawable and setStackedBackgroundDrawable, the action bar remains black. IS there any way to set it to a different color so it fits in with the app?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.