我想在列表中实现部分.我有一份任务清单. List有一个自定义适配器,它扩展了recyclerview刷卡适配器,因为我已经实现了向recyclerview的滑动手势.
因此,现在任务列表与已完成和待处理任务一起显示.每个列表项都有一个复选框,显示任务已完成或待处理.
如果选中复选框,则任务完成,反之亦然.现在我想用标题创建两个部分.一个用于已完成的任务,另一个用于待处理任
所以完成的任务应该显示在已完成的部分内,反之亦然.此外,如果未检查任务,即挂起,如果用户选中复选框,则该项应从待处理部分中删除,并应添加到已完成的部分,反之亦然.
我检查了一个库的部分.
https://github.com/afollestad/sectioned-recyclerview
但是当我尝试实现库时,我得到了错误,即适配器无法扩展两个类,因为之前我已经扩展了recyclelerview swipe库.
适配器:
public class IAdapter extends RecyclerSwipeAdapter<IAdapter.ItemViewHolder> { public ArrayList<Task> items; Context conext; public int _mId; List<Task> itemsPendingRemoval = new ArrayList<>(); public IAdapter(Context context,ArrayList<Task> item) { this.conext=context; this.items=item; } @Override public int getItemCount() { return items.size(); } public static class ItemViewHolder extends RecyclerView.ViewHolder { Task task; CheckBox cb; SwipeLayout swipeLayout; TaskTableHelper taskTableHelper; ItemViewHolder(final View itemView) { super(itemView); taskTableHelper= new TaskTableHelper(itemView.getContext()); swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipe); cb = (CheckBox) itemView.findViewById(R.id.checkBox); } } @Override public void onBindViewHolder(final ItemViewHolder itemViewHolder,final int i) { itemViewHolder.cb.setText(items.get(i).getTitle()); itemViewHolder.task = items.get(i); int taskId = itemViewHolder.task.getId(); itemViewHolder.task = itemViewHolder.taskTableHelper.getTask(taskId); int status = itemViewHolder.task.getStatus(); if(status == 0) { itemViewHolder.cb.setTextColor(Color.WHITE); } else { itemViewHolder.cb.setChecked(true); itemViewHolder.cb.setTextColor(Color.parseColor("#B0BEC5")); } itemViewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { if (isChecked) { itemViewHolder.cb.setTextColor(Color.parseColor("#B0BEC5")); itemViewHolder.task.setStatus(1); itemViewHolder.taskTableHelper.updateStatus(itemViewHolder.task); } else { itemViewHolder.cb.setTextColor(Color.WHITE); itemViewHolder.task.setStatus(0); itemViewHolder.taskTableHelper.updateStatus(itemViewHolder.task); } } }); final Task item = items.get(i); itemViewHolder.swipeLayout.addDrag(SwipeLayout.DragEdge.Right,itemViewHolder.swipeLayout.findViewById(R.id.bottom_wrapper_2)); itemViewHolder.swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown); itemViewHolder.swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() { @Override public void onDoubleClick(SwipeLayout layout,boolean surface) { Toast.makeText(conext,"DoubleClick",Toast.LENGTH_SHORT).show(); } }); itemViewHolder.swipeLayout.findViewById(R.id.trash2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mItemManger.removeShownLayouts(itemViewHolder.swipeLayout); items.remove(i); notifyItemRemoved(i); notifyItemRangeChanged(i,items.size()); mItemManger.closeAllItems(); itemViewHolder.taskTableHelper.deleteTask(item); _mId = item.getAlertId(); cancelNotification(); Toast.makeText(view.getContext(),"Deleted " + itemViewHolder.cb.getText().toString() + "!",Toast.LENGTH_SHORT).show(); } }); itemViewHolder.swipeLayout.findViewById(R.id.done).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { itemViewHolder.task.setStatus(1); itemViewHolder.taskTableHelper.updateStatus(itemViewHolder.task); itemViewHolder.cb.setChecked(true); Toast.makeText(conext,"Task Completed.",Toast.LENGTH_SHORT).show(); } }); itemViewHolder.swipeLayout.getSurfaceView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean mEditMode; int id = item.getId(); int priority = item.getTaskPriority(); String title = item.getTitle(); String alertDate = item.getAlertDate(); String alertTime = item.getAlertTime(); String dueDate = item.getDueDate(); String dueTime = item.getDueTime(); _mId = item.getAlertId(); int listId = item.getList(); mEditMode = true; Intent i = new Intent(conext,AddTaskActivity.class); i.putExtra("taskId",id); i.putExtra("taskTitle",title); i.putExtra("taskPriority",priority); i.putExtra("taskAlertTime",alertTime); i.putExtra("taskAlertDate",alertDate); i.putExtra("taskDueDate",dueDate); i.putExtra("taskDueTime",dueTime); i.putExtra("taskListId",listId); i.putExtra("EditMode",mEditMode); i.putExtra("AlertId",_mId); conext.startActivity(i); } }); mItemManger.bindView(itemViewHolder.itemView,i); } @Override public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int position) { View itemView = LayoutInflater. from(viewGroup.getContext()). inflate(R.layout.card_layout,viewGroup,false); return new ItemViewHolder(itemView); } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); } public void remove(int position) { Task item = items.get(position); if (itemsPendingRemoval.contains(item)) { itemsPendingRemoval.remove(item); } if (items.contains(item)) { items.remove(position); notifyItemRemoved(position); } } public void cancelNotification() { AlarmManager alarmManager = (AlarmManager)conext.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(conext,NotificationReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(conext,_mId,intent,0); alarmManager.cancel(pendingIntent); } @Override public int getSwipeLayoutResourceId(int position) { return R.id.swipe; } }
编辑:
扩展sectionedRecyclerview适配器后的onBindViewHolder方法:
@Override public void onBindViewHolder(ItemViewHolder itemViewHolder,int section,int i,int absolutePosition) { itemViewHolder.cb.setText(items.get(i).getTitle()); itemViewHolder.task = items.get(i); int taskId = itemViewHolder.task.getId(); itemViewHolder.task = itemViewHolder.taskTableHelper.getTask(taskId); int status = itemViewHolder.task.getStatus(); if(status == 0) { itemViewHolder.cb.setTextColor(Color.WHITE); } else { itemViewHolder.cb.setChecked(true); itemViewHolder.cb.setTextColor(Color.parseColor("#B0BEC5")); } itemViewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { if (isChecked) { itemViewHolder.cb.setTextColor(Color.parseColor("#B0BEC5")); itemViewHolder.task.setStatus(1); itemViewHolder.taskTableHelper.updateStatus(itemViewHolder.task); } else { itemViewHolder.cb.setTextColor(Color.WHITE); itemViewHolder.task.setStatus(0); itemViewHolder.taskTableHelper.updateStatus(itemViewHolder.task); } } }); final Task item = items.get(i); itemViewHolder.swipeLayout.addDrag(SwipeLayout.DragEdge.Right,itemViewHolder.swipeLayout.findViewById(R.id.bottom_wrapper_2)); itemViewHolder.swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown); itemViewHolder.swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() { @Override public void onDoubleClick(SwipeLayout layout,boolean surface) { Toast.makeText(conext,Toast.LENGTH_SHORT).show(); } }); itemViewHolder.swipeLayout.findViewById(R.id.trash2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mItemManger.removeShownLayouts(itemViewHolder.swipeLayout); items.remove(i); notifyItemRemoved(i); notifyItemRangeChanged(i,items.size()); mItemManger.closeAllItems(); itemViewHolder.taskTableHelper.deleteTask(item); _mId = item.getAlertId(); cancelNotification(); Toast.makeText(view.getContext(),Toast.LENGTH_SHORT).show(); } }); itemViewHolder.swipeLayout.findViewById(R.id.done).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { itemViewHolder.task.setStatus(1); itemViewHolder.taskTableHelper.updateStatus(itemViewHolder.task); itemViewHolder.cb.setChecked(true); Toast.makeText(conext,Toast.LENGTH_SHORT).show(); } }); itemViewHolder.swipeLayout.getSurfaceView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean mEditMode; int id = item.getId(); int priority = item.getTaskPriority(); String title = item.getTitle(); String alertDate = item.getAlertDate(); String alertTime = item.getAlertTime(); String dueDate = item.getDueDate(); String dueTime = item.getDueTime(); _mId = item.getAlertId(); int listId = item.getList(); mEditMode = true; Intent i = new Intent(conext,AddTaskActivity.class); i.putExtra("taskId",id); i.putExtra("taskTitle",title); i.putExtra("taskPriority",priority); i.putExtra("taskAlertTime",alertTime); i.putExtra("taskAlertDate",alertDate); i.putExtra("taskDueDate",dueDate); i.putExtra("taskDueTime",dueTime); i.putExtra("taskListId",listId); i.putExtra("EditMode",mEditMode); i.putExtra("AlertId",_mId); conext.startActivity(i); } }); mItemManger.bindView(itemViewHolder.itemView,i); }
我怎样才能做到这一点?有人可以帮忙吗?
谢谢..
解决方法
将回收站视图拆分为多个部分的最简单方法是使用包含标题和项目的布局,然后在标题相同时更改可见性.
布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tvHeader" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start" android:padding="16dp" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="@color/primary" android:textStyle="bold" tools:text="A" /> <TextView android:id="@+id/tvName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/tvHeader" android:background="?android:attr/selectableItemBackground" android:padding="16dp" android:textAppearance="?android:attr/textAppearanceMedium" tools:text="Adam" /> </RelativeLayout>
适配器(2018年Kotlin版):
class ContactAdapter @Inject constructor() : RecyclerView.Adapter<ContactAdapter.ViewHolder>() { var onItemClick: ((Contact) -> Unit)? = null var contacts = emptyList<Contact>() override fun getItemCount(): Int { return contacts.size } override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder { return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_contact,parent,false)) } override fun onBindViewHolder(holder: ViewHolder,position: Int) { val name = contacts[position].name holder.header.text = name.substring(0,1) holder.name.text = name // if not first item,check if item above has the same header if (position > 0 && contacts[position - 1].name.substring(0,1) == name.substring(0,1)) { holder.headerTextView.visibility = View.GONE } else { holder.headerTextView.visibility = View.VISIBLE } } inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val headerTextView: TextView = itemView.tvHeader val nameTextView: TextView = itemView.tvName init { itemView.setOnClickListener { onItemClick?.invoke(contacts[adapterPosition]) } } } }
可能也有帮助:RecyclerView itemClickListener in Kotlin
旧Java适配器版本:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.DataViewHolder> { private List<Contact> mData; @Inject public RecyclerAdapter() { mData = new ArrayList<>(); } public void setData(List<Contact> data) { mData = data; } public Contact getItem(int position){ return mData.get(position); } @Override public DataViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_contact,false); return new DataViewHolder(itemView); } @Override public void onBindViewHolder(final DataViewHolder holder,int position) { Contact contact = mData.get(position); holder.headerTextView.setText(contact.getName().substring(0,1)); holder.nameTextView.setText(contact.getName()); // if not first item check if item above has the same header if (position > 0 && mData.get(position - 1).getName().substring(0,1).equals(contact.getName().substring(0,1))) { holder.headerTextView.setVisibility(View.GONE); } else { holder.headerTextView.setVisibility(View.VISIBLE); } } @Override public int getItemCount() { return mData.size(); } public class DataViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.text_header) TextView headerTextView; @BindView(R.id.text_name) TextView nameTextView; public DataViewHolder(View itemView) { super(itemView); ButterKnife.bind(this,itemView); } } }