如何从主布局获取recycelrview适配器中的某些组件?

时间:2018-11-25 07:45:34

标签: java android android-recyclerview recycler-adapter

我在activity_main.xml中有recyclerview,并且那里有向用户显示的图像-空或非空recyclerview。 activity_main.xml:

 <RelativeLayout
     android:id="@+id/main_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent">

     <android.support.v7.widget.RecyclerView
         android:visibility="gone"
         android:id="@+id/main_recycler_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:scrollbars="vertical" />

      <LinearLayout
         android:visibility="visible"
         android:id="@+id/block_no_alarms"
         android:orientation="vertical"
         android:layout_centerInParent="true"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">
         <ImageView
             android:src="@drawable/ic_nothing"
             android:layout_width="match_parent"
             android:layout_height="70dp" />
         <TextView
             android:text="@string/no_alarms"
             android:textColor="@color/colorWhite"
             android:layout_marginTop="10dp"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content" />
     </LinearLayout>
  </RelativeLayout>

我有recyclerview一项xml文件

 <?xml version="1.0" encoding="utf-8"?>
  <android.support.v7.widget.CardView 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     app:cardCornerRadius="7dp"
     app:cardBackgroundColor="@color/colorDark"
     android:layout_marginLeft="10dp"
     android:layout_marginRight="10dp"
     android:layout_marginTop="8dp"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">

     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent">
      <TextView
         android:id="@+id/tv_time_alarm_one_item"
         android:textColor="@color/colorWhite"
         android:layout_margin="15dp"
         android:textSize="25sp"
         android:layout_centerVertical="true"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content" />
      <TextView
         android:id="@+id/tv_description_alarm_one_item"
         android:textColor="@color/colorWhite"
         android:layout_toRightOf="@id/tv_time_alarm_one_item"
         android:textSize="14sp"
         android:maxLines="2"
         android:layout_marginRight="60dp"
         android:ellipsize="end"
         android:layout_centerVertical="true"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_toEndOf="@id/tv_time_alarm_one_item"
         android:layout_marginEnd="60dp" />
       <Switch
          android:id="@+id/s_switch_alarm_one_item"
          android:layout_alignParentRight="true"
          android:checked="true"
          android:layout_centerVertical="true"
          android:layout_margin="15dp"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_alignParentEnd="true" />
       </RelativeLayout>

      </android.support.v7.widget.CardView>

我想在长按期间单击此名片视图,以从recyclerview中删除一项。适配器:

public class AlarmsAdapterMain extends RecyclerView.Adapter<AlarmsAdapterMain.ViewHolder> {
private List<String> listTimes = new ArrayList<>();
private List<String> listDescriptions = new ArrayList<>();
private List<Boolean> listStarted = new ArrayList<>(); // checked a switch

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.alarm_item, viewGroup, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
    viewHolder.time.setText(listTimes.get(i));
    viewHolder.description.setText(listDescriptions.get(i));
    viewHolder.aSwitch.setChecked(listStarted.get(i));
}

@Override
public int getItemCount() {
    return listTimes.size();
}

public void deleteAll() {
    listDescriptions.clear();
    listTimes.clear();
    listStarted.clear();
}

public void add(String time, String description) {
    listTimes.add(time);
    listDescriptions.add(description);
    listStarted.add(true); // by default
}

class ViewHolder extends RecyclerView.ViewHolder {
    private TextView time, description;
    private Switch aSwitch;

    ViewHolder(@NonNull final View itemView) {
        super(itemView);

        time = itemView.findViewById(R.id.tv_time_alarm_one_item);
        description = itemView.findViewById(R.id.tv_description_alarm_one_item);
        aSwitch = itemView.findViewById(R.id.s_switch_alarm_one_item);
       // I try to set long listener here
    }
}

}

我已经完成了,但是如果需要,我需要显示或隐藏图像或recyclerview。例如,我有一个警报,用户删除了该警报,他看到空的布局,但他必须看到image(LinearLayout)并隐藏recyclerview。那么,如何在适配器内完成该操作?

1 个答案:

答案 0 :(得分:0)

从适配器外部控制arrayLists,例如,在您的活动中,您应该有一个数据列表,并将arrayList传递给适配器的构造函数,并从活动中操作适配器数据,并且在arrayList上进行任何更改后只需要notifyDataChange 。因此,当您删除数据或添加一些数据时,您可以在广告的最后一行检查arrayList的大小或进行删除操作(在您的活动中),如果arrayList的大小等于0,则应该在用户界面上进行更改。

还有另一种方法,您可以有一个在您的活动中实现的接口,并且应该有两个用于zeroMode或nonZeroMode的方法,您可以将此接口传递给适配器,并在arrayList大小变为零或非时调用这些方法-零在您的适配器中。