android - RecyclerView 面临的小问题

标签 android android-5.0-lollipop android-recyclerview

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

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

  2. 可点击行:只有当我点击一行中的文本时,点击才有效,但我想允许用户点击一行中的任意位置(例如: ListView ) 以下 this链接

  3. Wrap RecyclerView:我在 recyclerview 中只有两条记录,但它占用了整个高度(我想根据 RecyclerView 中的记录来包装它,例如:listview)

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

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

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);

        .......

}

最佳答案

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 真正代表什么,但这是我通常采用的方法。我会像您一样创建项目 View ,但有一些更改:

<?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 的 View 的背景(或前景)设置为值 ?attr/selectableItemBackground?attr/selectableItemBackgroundBorderless 如果你想让涟漪超出 View 的范围。此值将在 5.0+ 上使用墨水波纹选择器,并且在任何较低的平台上将默认为您的标准无波纹选择器。但是,您可以创建自己的自定义波纹可绘制对象,但这会涉及更多一些。

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

5.

什么样的动画?比如,RecyclerView 项目动画?对于那些你可以通过子类化 ItemAnimator 创建你自己的动画并使用这个 method 应用它:

mRecyclerView.setItemAnimator(...)

或者您可以使用 default implementation :

mRecyclerView.setItemAnimator(new DefaultItemAnimator())

Otherwise 您的意思是使用 Activity Transitions 在 Activity 之间制作动画吗?如果是这样,您可以按照文档 here 进行操作 来设置 Activity Transitions,但它们仅适用于 Android 5.0+

关于android - RecyclerView 面临的小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28935631/

相关文章:

java - simpledateformat 更改时区

android - 在 Android 11 上编写许多文件

android - android上的不确定圆形进度条是白色的,尽管colorAccent颜色

android:windowNoTitle 不会隐藏带有 appcompat-v7 21.0.0 的操作栏

android - RecyclerView 适配器仅显示第一项

android - Travis-CI 运行两个安卓模拟器

android - android如何获得 "android.app.SuperNotCalledException "?

当用户从通知栏取消投影时 Android MediaProjection API 回调

android - 为什么 holder.imageview.getContext() 在 recyclerview 中返回 TintContextWrapper?

java - RecyclerView 的 onClick 方法使应用程序崩溃