繁体   English   中英

在Recyclerview中数据集为空时显示空视图

[英]Show empty view when data set is empty in recyclerview

我有一个recyclerview,其中显示了带有项目的多个cardviews。 在recyclerview中,我有一个弹出菜单删除当前的cardview。

当数据集为空时,我想显示一个空视图。 图片和文字说“空”的东西,我尝试了一些在线示例。 没有成功

我的布局是cardview( card_view_row.xml )是带有cardview的简单视图,其中显示了一些项目。

这是我的recyclerview

public class AlarmRecyclerViewAdapter extends 
 RecyclerView.Adapter<AlarmRecyclerViewAdapter.DataObjectHolder> {

    private ArrayList<Alarm> mDataset;
    private static AlarmRecyclerViewAdapter.MyClickListener myClickListener;
    private AlarmDataAccess dataAccess;

    private Alarm alarm;
    private int switchOn = 1;
    private int switchOff = 0;
    private static Context context;
    private PopupMenu popupMenu;


    public static class DataObjectHolder extends RecyclerView.ViewHolder
            implements View
            .OnClickListener {
        TextView label;
        TextView dateTime;
        TextView label2;
        TextView textViewLabel;
        TextView gender;
        TextView daysofweek;
        Switch aSwitch;
        ImageView trash;


        public DataObjectHolder(View itemView) {
            super(itemView);

            dateTime = (TextView) itemView.findViewById(R.id.textView2);
            label = (TextView) itemView.findViewById(R.id.textView);
            label2 =(TextView) itemView.findViewById(R.id.textView3);
            aSwitch = (Switch)itemView.findViewById(R.id.switchButton);
            trash = (ImageView)itemView.findViewById(R.id.imageTrash);
            gender = (TextView)itemView.findViewById(R.id.textViewGender);
            daysofweek = (TextView)itemView.findViewById(R.id.textViewDays);
            textViewLabel = (TextView)itemView.findViewById(R.id.textViewLabel);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            myClickListener.onItemClick(getAdapterPosition(), v);
        }
    }

    public void setOnItemClickListener(AlarmRecyclerViewAdapter.MyClickListener myClickListener) {
        this.myClickListener = myClickListener;
    }

    public AlarmRecyclerViewAdapter(ArrayList<Alarm> myDataset, Context context2) {
        mDataset = myDataset;
        context = context2;
    }

    @Override
    public AlarmRecyclerViewAdapter.DataObjectHolder onCreateViewHolder(ViewGroup parent,
                                                                        int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_row, parent, false);
        AlarmRecyclerViewAdapter.DataObjectHolder dataObjectHolder = new AlarmRecyclerViewAdapter.DataObjectHolder(view);
        return dataObjectHolder;
    }

    @Override
    public void onBindViewHolder(final AlarmRecyclerViewAdapter.DataObjectHolder holder, final int position) {
        boolean status = false;
        int gender;

        alarm = new Alarm();

        dataAccess = new AlarmDataAccess(context);
        dataAccess.open();

        holder.label.setText(mDataset.get(position).getHourOfDay() + ":" + mDataset.get(position).getMinute() + " " + mDataset.get(position).getTimeSet());
        holder.textViewLabel.setText(mDataset.get(position).getLabel());

        gender = mDataset.get(position).getGender();
        if(gender == 0){
            holder.gender.setText("Male voice");
        }else{
            holder.gender.setText("Female voice");
        }

        holder.daysofweek.setText(mDataset.get(position).getDays());
        holder.label2.setText("" + mDataset.get(position).getAffirmationName());


        holder.trash.setImageResource(R.drawable.menu2);


        if( mDataset.get(position).getStatus() == 0){
            status = false;
        }else {
            status = true;
        }

        holder.aSwitch.setChecked(status);


        holder.aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (buttonView.isPressed()) {
                    if (isChecked) {
                        mDataset.get(position).setStatus(switchOn);
                    } else {
                        mDataset.get(position).setStatus(switchOff);
                    }
                    alarm.setId(mDataset.get(position).getId());
                    alarm.setStatus(mDataset.get(position).getStatus());
                    dataAccess.updateStatus(alarm);
                }
            }

        });


        holder.trash.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                popupMenu = new PopupMenu(AlarmRecyclerViewAdapter.context, v);
                popupMenu.inflate(R.menu.popup_menu);
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.edit:
                                long selectedAlarmId = mDataset.get(position).getId();
                                Intent intent = new Intent(AlarmRecyclerViewAdapter.context, EditAlarmActivity.class);
                                intent.putExtra("id", selectedAlarmId);
                                intent.putExtra("Edit", "FromEdit");
                                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
                                AlarmRecyclerViewAdapter.context.startActivity(intent);
                                return true;
                            case R.id.delete:
                                long id = mDataset.get(position).getId();
                                mDataset.remove(position);
                                notifyItemRemoved(position);
                                notifyItemRangeChanged(position, mDataset.size());
                                dataAccess.deleteAlarm(id);
                                return true;
                        }
                        return false;

                    }
                });

                popupMenu.show();
            }
        });
    }

    public void deleteItem(int index) {
        mDataset.remove(index);
        notifyItemRemoved(index);
    }

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

我的recyclerview在片段视图内

<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_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment_place">

    <ImageButton
        android:id="@+id/add_button"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_gravity="end|bottom"
        android:tint="@color/icon"
        android:elevation="12dp"
        android:background="@drawable/oval_ripple"
        tools:backgroundTint="#96ceb4"
        android:src="@android:drawable/ic_input_add"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginStart="12dp"
        android:layout_marginTop="14dp" />


    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:layout_below="@+id/add_button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="16dp" />

</RelativeLayout>

有没有一种方法可以检测数据集是否为空以显示带有文本为空或其他内容的空视图? 我需要在recyclerview中完成此操作,因为我要删除其中的项目。

编辑

我终于想出了办法。 如果有人遇到相同问题,我会发布此信息。

http://akbaribrahim.com/empty-view-for-androids-recyclerview/

对于我个人使用,我使用以下技巧:

我使用两个LinearLayout,一个使用我的RecyclerView,另一个使用一个简单的TextView,说“ Empty”。 两者都在同一父视图中。

<LinearLayout
        android:id="@+id/linearContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:visibility="invisible">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/my_recycler_view"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:scrollbars="vertical" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearEmpty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textEmpty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="30dp"
            android:text="@string/dialog_no_result"
            android:textColor="@color/cardview_dark_background" />
    </LinearLayout>

当我更新项目列表时,我调用此方法:

if (linearContent != null && linearEmpty != null) {
        if (mListItems.isEmpty()) {
            linearContent.setVisibility(View.GONE);
            linearEmpty.setVisibility(View.VISIBLE);
            textEmpty.setVisibility(View.VISIBLE);
        } else {
            linearContent.setVisibility(View.VISIBLE);
            linearEmpty.setVisibility(View.GONE);
            textEmpty.setVisibility(View.GONE);
        }
    }

然后,我使用相同的布局,但只是更改了某些对象的可见性。

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM