单击 RecyclerView 时显示附加信息

Posted

技术标签:

【中文标题】单击 RecyclerView 时显示附加信息【英文标题】:Show additional info when RecyclerView is clicked 【发布时间】:2021-01-02 05:12:53 【问题描述】:

我有一个 RecyclerView,其中包含从 firebase 实时数据库中提取的姓名列表,以及电话号码、电子邮件和地址。我已经为 RecyclerView 中显示的卡片创建了布局。我希望他们只显示名称和图像,直到被点击。单击后,它们会展开并显示电话号码、电子邮件和地址。我已经完成了所有这些,但我面临的最后一个问题是 RecyclerView 的 layout.xml 中的 RelativeLayout 的 setVisibility,因为它与属于我的应用程序不断崩溃的活动的 xml 不同。我已经尝试了多种解决方案来解决与我类似的问题,但我永远找不到与我面临同样问题的人。

现在如果我使用这段代码:

mUserInfoLayout = (RelativeLayout) findViewById(R.id.user_additional_info_layout);
mUserInfoLayout.setVisibility(View.INVISIBLE);

我收到此错误

Attempt to invoke virtual method 'void android.widget.RelativeLayout.setVisibility(int)' on a null object reference

但是,如果我使用下面提供的代码,布局仍然可见。

我的 MainActivity.java OnCreate

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mAuth = FirebaseAuth.getInstance();

    //Firebase
    mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Users");
    mUserDatabase.keepSynced(true);

    //mUserSingleMainLayout = (RelativeLayout) findViewById(R.id.user_single_main_layout);


    mUsersList = (RecyclerView) findViewById(R.id.users_list);
    mUsersList.setHasFixedSize(true);
    mUsersList.setLayoutManager(new LinearLayoutManager(this));


    View usersingleView = getLayoutInflater().inflate(R.layout.users_single_layout, null);
    mUserInfoLayout = (RelativeLayout) usersingleView.findViewById(R.id.user_additional_info_layout);
    mUserInfoLayout.setVisibility(View.INVISIBLE);

    //Buttons
    mUserAdd = (FloatingActionButton) findViewById(R.id.user_add_btn);

    mUserAdd.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 

            Intent createuserIntent = new Intent(MainActivity.this, CreateUserActivity.class);
            startActivity(createuserIntent);

        
    );



我的activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".MainActivity">

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id="@+id/user_add_btn"
    android:layout_
    android:layout_
    android:layout_alignParentEnd="true"
    android:layout_alignParentBottom="true"
    android:layout_marginEnd="20dp"
    android:layout_marginBottom="20dp"
    app:fabSize="normal"
    app:rippleColor="@color/colorPrimary"
    android:src="@drawable/ic_add_white_24dp"/>

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/users_list"
    android:layout_
    android:layout_
    android:layout_alignParentStart="true"/>


</RelativeLayout>

我的user_single_layout.xml RecyclerView中使用的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_
android:layout_
android:orientation="vertical">

<de.hdodenhof.circleimageview.CircleImageView
    android:id="@+id/user_single_image"
    android:layout_
    android:layout_
    android:layout_marginStart="15dp"
    android:layout_marginTop="15dp"
    android:layout_marginBottom="15dp"
    android:src="@drawable/account_circle" />

<TextView
    android:id="@+id/user_single_name"
    android:layout_
    android:layout_
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="100dp"
    android:layout_marginTop="20dp"
    android:text="@string/display_name_users"
    android:textColor="@color/colorBlack"
    android:textSize="18sp" />


  <RelativeLayout
     android:id="@+id/user_additional_info_layout"
     android:animateLayoutChanges="true"
     android:layout_
     android:layout_
     android:layout_below="@id/user_single_name"
     android:layout_marginTop="10dp"
     android:layout_alignParentStart="true"
     android:layout_marginStart="100dp">

    <ImageView
        android:id="@+id/user_phone_image"
        android:layout_
        android:layout_
        android:layout_alignParentStart="true"
        android:layout_alignTop="@+id/user_single_phone"
        android:src="@drawable/ic_phone_black_24dp"/>

    <ImageView
        android:id="@+id/user_email_image"
        android:layout_
        android:layout_
        android:layout_alignParentStart="true"
        android:layout_alignTop="@+id/user_single_email"
        android:layout_below="@+id/user_phone_image"
        android:src="@drawable/ic_email_black_24dp"/>

    <ImageView
        android:id="@+id/user_address_image"
        android:layout_
        android:layout_
        android:layout_alignParentStart="true"
        android:layout_alignTop="@+id/user_single_address"
        android:src="@drawable/ic_map_marker_black_24dp" />

    <TextView
        android:id="@+id/user_single_phone"
        android:layout_
        android:layout_
        android:layout_toRightOf="@+id/user_phone_image"
        android:layout_marginStart="20dp"
        android:layout_marginTop="10dp"
        android:text="Phone" />

    <TextView
        android:id="@+id/user_single_email"
        android:layout_
        android:layout_
        android:layout_marginStart="20dp"
        android:layout_below="@+id/user_single_phone"
        android:layout_toRightOf="@+id/user_email_image"
        android:layout_marginTop="10dp"
        android:text="Email" />
    <TextView
        android:id="@+id/user_single_address"
        android:layout_
        android:layout_
        android:layout_marginStart="20dp"
        android:layout_marginTop="10dp"
        android:layout_below="@+id/user_single_email"
        android:layout_toRightOf="@id/user_address_image"
        android:text="Address" />

  </RelativeLayout>

</RelativeLayout>

在 user_single_layout.xml 中,我想在 MainActivity.java 中以编程方式使“@+id/user_additional_info_layout”RelativeLayout 不可见

【问题讨论】:

您可以简单地使用 ExpandableListView 否则使用 LinearLayout 并进行过渡以展开和折叠视图。 LinearLayout 效果更好我有 Kotlin 中的实际代码,如果您对它感兴趣,我可以发送。 拜托,任何帮助表示赞赏。 【参考方案1】:

编辑

我的答案集中在 Fragment 生命周期。 Activity生命周期不同,不包含我建议的方法。

问题是您尝试访问的视图为空。该视图尚未在 onCreate 方法中膨胀,因此尚不可用。

不应在 onCreate() 中执行与视图相关的逻辑。

您需要使用 onViewCreated() 方法来访问具有以下签名的视图:

@Override
public void onViewCreated(View view, Bundle savedInstanceState)

    

因此我建议您将所有与视图相关的逻辑都移到此方法中。

【讨论】:

【参考方案2】:

首先,将您的代码移动到 recyclerView 适配器。 其次,使 relativeLayout 可见性消失并将其更改为 linearLayout。 第三,使用此代码对其进行扩展。

private fun animateView(
view: View,
duration: Long,
initialHeight: Int,
targetHeight: Int,
onAnimationEnd: () -> Unit = 
  ) 
      view.apply 
       val animator = ValueAnimator.ofInt(initialHeight, targetHeight)
         animator.addUpdateListener 
          layoutParams.height = it.animatedValue as Int
          requestLayout()
          if (it.animatedValue as Int > 2) 
              //Make the view visible in java 
              //yourview.setVisibility(View.Visible)
              show()
          
      
       animator.addListener(object : Animator.AnimatorListener 
           override fun onAnimationEnd(animation: Animator) 
              layoutParams.height = targetHeight
              onAnimationEnd.invoke()
           

           override fun onAnimationStart(animation: Animator) 

           

           override fun onAnimationCancel(animation: Animator) 
           override fun onAnimationRepeat(animation: Animator) 
       )
       animator.interpolator = AccelerateDecelerateInterpolator()
       animator.duration = duration
       animator.start()
   
  
  fun View.expandAnimation(duration: Long) 
     measure(ViewGroup.LayoutParams.MATCH_PARENT, 
     ViewGroup.LayoutParams.WRAP_CONTENT)
     val initialHeight = 0
     val targetHeight = measuredHeight

     layoutParams.height = 0
     animateView(this, duration, initialHeight, targetHeight)
    

 fun View.collapseAnimation(duration: Long) 
     val initialHeight = measuredHeight
     val targetHeight = 0

    animateView(this, duration, initialHeight, targetHeight) 
       hide()
    
  

 fun View.hide() 
    this.apply 
       visibility = View.GONE
   
 

 fun View.show() 
    this.apply 
       visibility = View.VISIBLE
   
  

您可以轻松将此代码转换为 java sry 我没有时间自己转换它

【讨论】:

以上是关于单击 RecyclerView 时显示附加信息的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮时显示 div Javascript

单击 UIBarButtonItem 时显示 UIMenu

引导按钮单击时显示蓝色轮廓

单击搜索结果时显示空的详细信息视图

当recyclerview中没有任何内容时显示ItemDecoration

水平 RecyclerView 中的 VideoView 在滑动时显示墙纸