RecyclerView面临小问题

时间:2015-03-09 05:15:05

标签: android android-5.0-lollipop android-recyclerview recycler-adapter

我在我的程序中使用RecyclerView,面对一些小问题,我相信你们中的一些人已经面对并解决了所有这些问题。

  1. Separator color:使用DividerItemDecoration.java显示Items之间的分隔符,但如果我想更改分隔线颜色(例如:默认为白色),则不知道在哪里进行更改< / p>

  2. Clickable Row:点击仅在我点击一行中的文字时有效,但我想允许用户点击一行中的任何地方(例如:listview) 关注this链接

  3. Wrap RecyclerView:我在recyclerview中只有两条记录,但它的消耗全高(我想根据RecyclerView中的记录包装它,如:listview)

  4. Ripple Effect:每当我点击RecyclerView中的任何项目时都没有获得RippleEffect,而当我点击列表项目获得涟漪效应

  5. RecyclerView Item Animation:当我点击RecyclerView中的任何项目时,如何实现动画

  6. fragment_main.xml: -

    <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/btn_rounded"/>
    

    adapter_main.xml: -

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/LinearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/textTitle"
            style="@style/AppTheme.ListTextView"
            />
    
    </LinearLayout>
    

    styles.xml: -

    <style name="AppTheme.ListTextView" parent="android:Widget.Material.TextView">
            <item name="android:gravity">left</item>
            <item name="android:layout_width">match_parent</item>
            <item name="android:layout_height">wrap_content</item>            
            <item name="android:padding">10dp</item>
        </style>
    

    btn_rounded.xml: -

    <?xml version="1.0" encoding="utf-8"?>
    
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <solid android:color="#008f8471"/>
        <stroke android:width="2dp" android:color="#ffffff" />
        <corners android:radius="10dp"/>
    </shape>
    

    MainAdatper.java: -

    @Override
    public void onBindViewHolder(MainHolder holder, final int position) {
        .....
        holder.mRootView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String strTitle = list.get(position).getTitle().toString();
    
                Intent intent = new Intent(context, DetailActivity.class);
                intent.putExtra("title", strTitle);
                context.startActivity(intent);
            }
        });
    

    MainFragment.xml: -

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            view = inflater.inflate(R.layout.fragment_main, container, false);
    
            /* Initialize recycler view */
            mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    
            mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
    
            list = new ArrayList<MainPoho>();
            adapter = new MainAdapter(getActivity(), list);
            mRecyclerView.setAdapter(adapter);
    
            .......
    
    }
    

2 个答案:

答案 0 :(得分:6)

1。

首先,创建一个可绘制的xml文件,代表分隔符,如下所示:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="@color/white" /> <!-- or you could use hex i.e. #ffffff -->
    <size android:height="1dp" />
</shape>

然后将该分隔符设置为DividerItemDecoration,如下所示:

new DividerItemDecoration(getResources().getDrawable(R.drawable.recycler_divider))

<强> 2

没有看到你如何夸大你的ViewHolder我不知道mRootView真正代表什么,但这是我通常采取的方法。我会像你一样创建项目视图,但有一些变化:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="?attr/selectableItemBackground">
    <!-- This will give your recycler item the ink ripple effect and touch state -->

    <TextView
        android:id="@+id/textTitle"
        style="@style/AppTheme.ListTextView"
        />

</LinearLayout>

然后在您的onBindViewHolder(...)方法中,您希望将OnClickListener设置为持有者中的itemView对象,如下所示:

@Override
public void onBindViewHolder(MainHolder holder, final int position) {
    .....
    holder.itemView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            String strTitle = list.get(position).getTitle().toString();

            /**
             * Here is where I would typically create a java interface to use as a
             * callback to the fragment/activity/whatever to take action rather
             * than keeping this code in the adapter
             */

            Intent intent = new Intent(context, DetailActivity.class);
            intent.putExtra("title", strTitle);
            context.startActivity(intent);
        }
    });
}

这可以让你将整个单元格用作可点击区域+涟漪效应。

第3

使RecyclerView垂直包装其内容有点棘手。您必须继承LinearLayoutManager并覆盖它的onMeasure(...)方法以强制它包装它的内容。请在此处参阅此帖:https://stackoverflow.com/a/27616854/1623828

<强> 4

请参阅我对#2的回答。如果您希望纹波超出视图范围,则必须将要设置OnClickListener的视图的背景(或前景)设置为值?attr/selectableItemBackground?attr/selectableItemBackgroundBorderless 。此值将在5.0+时使用墨水纹波选择器,并且在任何较低的平台上默认为标准无纹波选择器。但是,您可以创建自己的自定义波纹绘制,但这需要更多参与。

文档:http://developer.android.com/training/material/animations.html#Touch

<强> 5

什么样的动画?像,RecyclerView项目动画?对于那些您可以通过继承ItemAnimator并使用此method应用它来创建自己的动画:

mRecyclerView.setItemAnimator(...)

或者您可以使用default implementation

mRecyclerView.setItemAnimator(new DefaultItemAnimator())

否则是指使用活动转换在活动之间制作动画?如果是这样,您可以按照文档 here 来设置活动转换,但它们只适用于 Android 5.0 +

答案 1 :(得分:0)

作为所有要点的替代解决方案(但是4),最近我改进并为所有RecyclerView创建了 FlexibleAdapter 模式。 使用起来非常简单,只需在公共文件中复制2个类+一些xml,以便像ListView那样启用选择(单个/多个)。

请查看说明和完整的工作示例:https://github.com/davideas/FlexibleAdapter

对于第4点的原因,因为你应该放弃它,因为它非常复杂,并且当你将它与它结合时,解决方案(包装工作)会产生令人难以置信的影响,如循环选择和notifyXXX()。奇怪的是,但是当我使用它时,我开始在滚动时遇到麻烦和缓慢。所以我删除了,现在我使用默认的:LinearLayoutManager。

对于最后一点(5),这里有许多奇特的动画:http://toastdroid.com/2014/09/03/unlocking-recyclerview/