验证RecyclerView内容

时间:2019-05-09 07:28:19

标签: android validation android-recyclerview android-viewholder

我认为无需重复有关如何设置RecyclerView的确切描述。此处描述:Android - RecyclerView with various dynamic content, different for each item

简而言之,我的RecyclerView可能包含各种控件,例如编辑文本,微调框等。然后,recyclerview放置在Activity布局中,始终以嵌套滚动视图作为其父级进行扩展。当用户在我的活动中单击“确认”按钮时,应验证回收者视图的内容-例如,如果任何特定项目包含需要为非空的textview,则活动不应结束,并且应在该特定编辑文本中显示标准错误标记

在回收者视图中,我创建了validate方法,该方法应该返回truefalse,这样我才能知道验证结果。但是,我不知道如何从适配器访问特定的recyclerview项的内容,这是我的方法(在这种情况下,将文本控件的类型设置为email):

public boolean validate()
    {
        for(Object item : items)
        {
            Parameter p = (Parameter)item;

            switch (p.type)
            {
                case Parameter.EMAIL_PARAM:
                {

                    String email = ((EmailParameter)p).value;
                    /*validate email here, if invalid, return
                     false and set error indicatior for corresponding 
                     recyclerview item*/

                }
            }
        }


        return true;
    }

itemsList<Object>,它包含具有各种实际类型的所有recyclerview项,每种类型都确定呈现的特定recylerview内容。当用户更改特定项目的控件时,items中的相应项目将分别进行更新,因此,调用validate时,所有项目都包含新数据(如果为EmailParameter,则为{{1 }}字段已设置为在编辑文本控件中键入的文本。

由于我可以轻松地验证最终值,所以我不知道如何更新相应的回收站视图项目控件以显示错误。

您有什么想法吗?

2 个答案:

答案 0 :(得分:1)

有效的解决方案-使用notifyDatasetChanged

public boolean validate()
    {
        boolean allValid = true;

        for(Object item : items)
        {
            Parameter p = (Parameter)item;

            switch (p.type)
            {
                case Parameter.EMAIL_PARAM:
                {

                    String email = ((EmailParameter)p).value;
                    /*validate email here, if invalid, return
                     false and set error indicatior for corresponding 
                     recyclerview item*/

                    p.errorMessage = valid ? null:"Email is incorrect";
                    allValid &= valid;

                    break;

                }
               /*All remaining parameter types validaion*/
            }



        }


         if(!allValid) this.notifyDataSetChanged();
         return allValid;
    }

答案 1 :(得分:0)

也许您需要的是该库https://github.com/Link184/KidAdapter

这是一个简短的示例,您可以通过它来验证数据:

val adapter : TypedKidAdapter = recyclerView.setUp {
    withViewType {
        withItems(mutableListOf("one", "two"))
        withLayoutResId(android.R.layout.list_content)
        withContentComparator<String> { oldObject, newObject ->
            insertNewViewType(newItems)
            oldObject.compareTo(newObject)
        }
        withItemsComparator<String> { oldObject, newObject ->
            oldObject.equals(newObject).also {
                updateItemsFromViewType(someNewItems)
            }
        }
        bind<String> {
            //ui logic
        }
    }

    withViewType {
        //another viewtype config
    }
}

fun insertNewViewType(newItems: MutableList<Any>) {
    adapter restructure {
        insertTop {
            withItems(newItems)
            withLayoutResId(android.R.layout.list_content)
            withItemsComparator<Any> {
                ...
            }
            bind<Any> { 
                //UI logic
            }
        }
    }
}

fun updateItemsFromViewType(newItems: String) {
    adapter update {
        insertBottom(newItems)
    }
}