2017-01-29 74 views
2

我已经实现了两个RecyclerView适配器,一个是RecyclerViewAdapter,另一个是EmptyRecyclerViewAdapter。我试图做的是每当删除所有项目时显示文本Empty Text Here!。如果在列表中没有项目尚未删除所有recyclerview项目后,TextView将不会显示

Image 2工作,它会显示这是对Image 2但是,下面显示的文字Empty Text Here!,如果已经有名单上的项目,如果我将删除所有的项目的列表中,Image 1将会显示没有结果,没有文字。

EmptyRecyclerViewAdapter.class

public class EmptyRecyclerViewAdapter extends RecyclerView.Adapter<EmptyRecyclerViewAdapter.ViewHolder> { 

    private String mMessage; 

    public EmptyRecyclerViewAdapter(){} 

    public EmptyRecyclerViewAdapter(String message){ mMessage = message;} 

    @Override 
    public EmptyRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.empty_item, parent, false); 
     ViewHolder viewHolder = new ViewHolder(view); 

      if(mMessage != null){ 
       viewHolder.mMessageView.setText(mMessage); 
      } 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(EmptyRecyclerViewAdapter.ViewHolder holder, int position) {} 

    @Override 
    public int getItemCount() { return 1; } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     final View mView; 
     final TextView mMessageView; 

     public ViewHolder(View view) { 
      super(view); 
      mView = view; 
      mMessageView = (TextView) view.findViewById(R.id.empty_item_message); 
     } 
    } 
} 

RecyclerViewAdapter.class

public class RecyclerViewAdapter extends RecyclerView.Adapter <RecyclerView.ViewHolder> { 

    private List<ItemModel> list; 
    private Context mContext = null; 


    public RecyclerViewAdapter (Context context, List<ItemModel> itemList) { 
     mContext = context; 
     this.list = itemList; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); 
     return new MyViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 
     final ItemModel l = list.get(holder.getAdapterPosition()); 
     final DataDb dataDb = new DataDb (mContext); 

     ((MyViewHolder) holder).title.setText(l.getTitle()); 
     ((MyViewHolder) holder).caption.setText(l.getCaption()); 
     ((MyViewHolder) holder).removeBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String confirmText = "Are you sure you want to remove this item ?"; 
       AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AlertDialogStyle); 
       builder.setTitle("Deleting..");; 
       builder.setPositiveButton("Remove", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         list.remove(holder.getAdapterPosition()); 
         dataDb.removeItem(l.getId()); 
         notifyDataSetChanged(); 
        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }); 
       AlertDialog alert = builder.create(); 
       alert.getWindow().setLayout(600, 400); 
       alert.show(); 
      } 
     }); 

    } 

    @Override 
    public int getItemCount() { 
     return (list != null? list.size():0); 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder { 

     public TextView title; 
     public TextView caption; 
     ImageButton removeBtn; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      title = (TextView) itemView.findViewById(R.id.title); 
      caption = (TextView) itemView.findViewById(R.id.caption); 
      removeBtn = (ImageButton) itemView.findViewById(R.id.btnRemoveItem); 
     } 
    } 
} 

ActivityA.class

public class ActivityA extends Fragment { 

    List<ItemModel> list; 
    RecyclerView mRecyclerView; 
    RecyclerViewAdapter adapter; 
    ProgressBar progressBar; 
    DataDb dataDb; 
    EmptyRecyclerViewAdapter emptyRecyclerViewAdapter; 

    public ActivityA() {} 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 

     View rootView = inflater.inflate(activity_one_layout, container, false); 

     progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar); 
     mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview); 

     dataDb = new DataDb(getActivity()); 
     list= dataDb .getList(); 

     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(linearLayoutManager); 
     mRecyclerView.setHasFixedSize(true); 
     linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 

     if(list == null || list.size() == 0) { 
      progressBar.setVisibility(View.GONE); 
      emptyRecyclerViewAdapter = new EmptyRecyclerViewAdapter("Empty Text Here!"); 
      mRecyclerView.setAdapter(emptyRecyclerViewAdapter); 
     } else { 
      new LoadList().execute(); 
     } 

     return rootView; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
    } 

    private class LoadList extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      progressBar.setVisibility(View.VISIBLE); 
     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
      try { 
       Thread.sleep(1000); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void params){ 
      progressBar.setVisibility(View.GONE); 

      if(!list.isEmpty()) { 
       adapter = new RecyclerViewAdapter(getActivity(), list); 
       mRecyclerView.setAdapter(adapter); 
       adapter.notifyDataSetChanged(); 
      } else { 
       Toast.makeText(getActivity(), "", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 

图像1 - 输出结果

Result after removing all items

图片2 - 输出目标

Result on first check if empty

+0

你是在一个适配器删除一个项目,你需要更新中的另一个适配器项目。您需要将参考传递给emptyRecycler适配器或从活动中通知它。 –

回答

2

你已经让你的活动知道,在适配器设置列表中已发生变化,项目数归结到零。当列表大小变空时,您需要从“活动”切换适配器。

您可以使用接口来实现此目的。基本上,首先声明一个接口并在Adapter中保存它的一个实例。无论何时调用notifyDataSetChanged,都应该调用此接口的实例。这将触发在Activity中实现的接口方法。您可以从该点切换适配器。

修改你的类如下。

RecyclerViewAdapter.class

public class RecyclerViewAdapter extends RecyclerView.Adapter <RecyclerView.ViewHolder> { 

    //Declare an Interface which will work as a listener of notifyDataSetChanged. 
    // We'll then switch the adapter of Activity accordingly 
    public interface OnNotifyDataSetChanged { 
     void OnNotifyDataSetChangedFired(int dataSize); 
    } 

    private OnNotifyDataSetChanged onNotifyDataSetChanged; 


    private List<ItemModel> list; 
    private Context mContext = null; 


    public RecyclerViewAdapter (Context context, List<ItemModel> itemList, OnNotifyDataSetChanged onNotifyDataSetChanged) { 
     mContext = context; 
     this.list = itemList; 
     this.onNotifyDataSetChanged = onNotifyDataSetChanged; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); 
     return new MyViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 
     final ItemModel l = list.get(holder.getAdapterPosition()); 
     final DataDb dataDb = new DataDb (mContext); 

     ((MyViewHolder) holder).title.setText(l.getTitle()); 
     ((MyViewHolder) holder).caption.setText(l.getCaption()); 
     ((MyViewHolder) holder).removeBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String confirmText = "Are you sure you want to remove this item ?"; 
       AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AlertDialogStyle); 
       builder.setTitle("Deleting..");; 
       builder.setPositiveButton("Remove", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         list.remove(holder.getAdapterPosition()); 
         dataDb.removeItem(l.getId()); 
         notifyDataSetChanged(); 

         // Trigger our Interface instance to let the Activity know that the adapter is updated 
         if(onNotifyDataSetChanged != null){ 
          onNotifyDataSetChanged.OnNotifyDataSetChangedFired(list.size()); 
         } 
        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }); 
       AlertDialog alert = builder.create(); 
       alert.getWindow().setLayout(600, 400); 
       alert.show(); 
      } 
     }); 

    } 

    @Override 
    public int getItemCount() { 
     return (list != null? list.size():0); 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder { 

     public TextView title; 
     public TextView caption; 
     ImageButton removeBtn; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      title = (TextView) itemView.findViewById(R.id.title); 
      caption = (TextView) itemView.findViewById(R.id.caption); 
      removeBtn = (ImageButton) itemView.findViewById(R.id.btnRemoveItem); 
     } 
    } 
} 

ActivityA.class

public class ActivityA extends Fragment implements OnNotifyDataSetChanged { 

    List<ItemModel> list; 
    RecyclerView mRecyclerView; 
    RecyclerViewAdapter adapter; 
    ProgressBar progressBar; 
    DataDb dataDb; 
    EmptyRecyclerViewAdapter emptyRecyclerViewAdapter; 

    public ActivityA() {} 


    @Override 
    void OnNotifyDataSetChangedFired(int dataSize){ 
     //Now, switch the adapter if needed 
     if(dataSize <= 0){ 
      mRecyclerView.setAdapter(new EmptyRecyclerViewAdapter("Empty Text Here!")); 
     } 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 

     View rootView = inflater.inflate(activity_one_layout, container, false); 

     progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar); 
     mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview); 

     dataDb = new DataDb(getActivity()); 
     list= dataDb .getList(); 

     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(linearLayoutManager); 
     mRecyclerView.setHasFixedSize(true); 
     linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 

     if(list == null || list.size() == 0) { 
      progressBar.setVisibility(View.GONE); 
      emptyRecyclerViewAdapter = new EmptyRecyclerViewAdapter("Empty Text Here!"); 
      mRecyclerView.setAdapter(emptyRecyclerViewAdapter); 
     } else { 
      new LoadList().execute(); 
     } 

     return rootView; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
    } 

    private class LoadList extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      progressBar.setVisibility(View.VISIBLE); 
     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
      try { 
       Thread.sleep(1000); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void params){ 
      progressBar.setVisibility(View.GONE); 

      if(!list.isEmpty()) { 
       // New updated constructor of the Adapter 
       adapter = new RecyclerViewAdapter(getActivity(), list, ActivityA.this); 
       mRecyclerView.setAdapter(adapter); 
       adapter.notifyDataSetChanged(); 
      } else { 
       Toast.makeText(getActivity(), "", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
} 
+0

获取此部分的不兼容类型'this.onNotifyDataSetChanged = context;' – BXUMZSE

+0

更新了代码。 'RecyclerViewAdapter'的构造函数发生变化。你需要从这个活动中传递另一个参数。 – fluffyBatman

+0

我在这一行收到错误。 '; adapter = new RecyclerViewAdapter(getActivity(),list,getActivity());'预期的参数是OnNotifyDataSetChanged和实际参数getActivity(); – BXUMZSE