簡體   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