Java 如何在适配器中扩展多个类?
我想实现列表中的部分。我有一份任务清单。列表有一个自定义适配器,它扩展了recyclerview滑动适配器,因为我已经实现了对recyclerview的滑动手势 现在,任务列表与已完成和挂起的任务一起显示。每个列表项都有一个复选框,显示任务已完成或挂起 若复选框被选中,则任务完成,反之亦然。现在我想在这个标题中做两个部分。一个用于已完成的任务,另一个用于挂起的任务 所以完成的任务应该显示在完成的部分中,反之亦然。此外,如果未选中任务,即挂起,并且如果用户选中该复选框,则该项应从挂起部分删除,并应添加到已完成部分,反之亦然 我向一家图书馆查询了一些章节 但当我尝试实现该库时,我得到了一个错误,即适配器不能扩展两个类,因为我以前扩展过recyclerview swipe库 onBindViewHolder方法在扩展SectionedRecyclViewAdapter后,我得到一个错误,因为IAdapter应该实现onBindViewHolder(VH,int) 如何解决这个问题 适配器:Java 如何在适配器中扩展多个类?,java,android,android-recyclerview,multiple-inheritance,sections,Java,Android,Android Recyclerview,Multiple Inheritance,Sections,我想实现列表中的部分。我有一份任务清单。列表有一个自定义适配器,它扩展了recyclerview滑动适配器,因为我已经实现了对recyclerview的滑动手势 现在,任务列表与已完成和挂起的任务一起显示。每个列表项都有一个复选框,显示任务已完成或挂起 若复选框被选中,则任务完成,反之亦然。现在我想在这个标题中做两个部分。一个用于已完成的任务,另一个用于挂起的任务 所以完成的任务应该显示在完成的部分中,反之亦然。此外,如果未选中任务,即挂起,并且如果用户选中该复选框,则该项应从挂起部分删除,并应
public class IAdapter extends RecyclerSwipeAdapter<IAdapter.ItemViewHolder> , SectionedRecyclerViewAdapter<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 getSectionCount() {
return 2;
}
@Override
public int getItemCount(int section) {
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, int section,final 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, "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;
}
}
公共类IAdapter扩展了RecyclerSwipeAdapter,SectionedRecyclServiceAdapter{
公共阵列列表项;
语境语境;
公共INTU mId;
List ItemsPendingRemoving=新建ArrayList();
公共IAdapter(上下文,ArrayList项){
this.conext=上下文;
此项。项=项;
}
@凌驾
public int getSectionCount(){
返回2;
}
@凌驾
公共整数getItemCount(整数部分){
返回items.size();
}
公共静态类ItemViewHolder扩展了RecyclerView.ViewHolder{
任务;
复选框cb;
泳道布置泳道布置;
TaskTableHelper TaskTableHelper;
ItemViewHolder(最终视图itemView){
超级(项目视图);
taskTableHelper=新的taskTableHelper(itemView.getContext());
swipeLayout=(swipeLayout)itemView.findViewById(R.id.swipe);
cb=(复选框)itemviewbyd(R.id.CheckBox);
}
}
@凌驾
公共无效onBindViewHolder(最终ItemViewHolder ItemViewHolder,int段,最终int i,int绝对位置){
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();
如果(状态==0)
{
itemViewHolder.cb.setTextColor(Color.WHITE);
}
否则{
itemViewHolder.cb.setChecked(true);
itemViewHolder.cb.setTextColor(Color.parseColor(“#B0BEC5”);
}
itemViewHolder.cb.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
itemViewHolder.cb.setTextColor(Color.parseColor(“#B0BEC5”);
itemViewHolder.task.setStatus(1);
itemViewHolder.taskTableHelper.updateStatus(itemViewHolder.task);
}
其他的
{
itemViewHolder.cb.setTextColor(Color.WHITE);
itemViewHolder.task.setStatus(0);
itemViewHolder.taskTableHelper.updateStatus(itemViewHolder.task);
}
}
});
最终任务项=items.get(i);
itemViewHolder.swipeLayout.addDrag(swipeLayout.DrageEdge.Right,itemViewHolder.swipeLayout.findViewById(R.id.bottom_包装_2));
itemViewHolder.swipeLayout.setShowMode(swipeLayout.ShowMode.LayDown);
itemViewHolder.swipeLayout.setOnDoubleClickListener(新swipeLayout.DoubleClickListener(){
@凌驾
公共空心双单击(SwipeLayout布局,布尔曲面){
Toast.makeText(conext,“双击”,Toast.LENGTH_SHORT).show();
}
});
itemViewHolder.swipeLayout.findViewById(R.id.trash2).setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
删除显示布局(itemViewHolder.swipeLayout);
删除第(i)项;
(i)删去第(i)款;
notifyItemRangeChanged(i,items.size());
mItemManger.closeAllItems();
itemViewHolder.taskTableHelper.deleteTask(项目);
_mId=item.getAlertId();
取消通知();
Toast.makeText(view.getContext(),“Deleted”+itemViewHolder.cb.getText().toString()+“!”,Toast.LENGTH_SHORT).show();
}
});
itemViewHolder.swipeLayout.findViewById(R.id.done).setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图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(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
布尔模式;
int id=item.getId();
int priority=item.getTaskPriority();
String title=item.getTitle();
字符串alertDate=item.getAlertDate();
字符串alertTime=item.getAlertTime();
字符串dueDate=item.getDueDate();
字符串dueTime=item.getDueTime();
public class MainAdapter extends SectionedRecyclerViewAdapter<MainAdapter.MainVH> {
@Override
public int getSectionCount() {
return 20; // number of sections.
}
@Override
public int getItemCount(int section) {
return 8; // number of items in section (section index is parameter).
}
@Override
public void onBindHeaderViewHolder(MainVH holder, int section) {
// Setup header view.
}
@Override
public void onBindViewHolder(MainVH holder, int section, int relativePosition, int absolutePosition) {
// Setup non-header view.
// 'section' is section index.
// 'relativePosition' is index in this section.
// 'absolutePosition' is index out of all non-header items.
// See sample project for a visual of how these indices work.
}
@Override
public MainVH onCreateViewHolder(ViewGroup parent, int viewType) {
// Change inflated layout based on 'header'.
View v = LayoutInflater.from(parent.getContext())
.inflate(viewType == VIEW_TYPE_HEADER ? R.layout.header : R.layout.normal, parent, false);
return new MainVH(v);
}
public static class MainVH extends RecyclerView.ViewHolder {
public MainVH(View itemView) {
super(itemView);
// Setup view holder.
// You'd want some views to be optional, e.g. for header vs. normal.
}
}
}
class TaskSection extends StatelessSection {
String title;
List<Task> list;
public TaskSection(String title, List<Task> list) {
// call constructor with layout resources for this Section header, footer and items
super(R.layout.section_header, R.layout.section_item);
this.title = title;
this.list = list;
}
@Override
public int getContentItemsTotal() {
return list.size(); // number of items of this section
}
public int addTask(Task task) {
return list.add(task;
}
public int removeTask(Task task) {
return list.remove(task;
}
@Override
public RecyclerView.ViewHolder getItemViewHolder(View view) {
// return a custom instance of ViewHolder for the items of this section
return new MyItemViewHolder(view);
}
@Override
public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
MyItemViewHolder itemHolder = (MyItemViewHolder) holder;
// bind your view here
itemHolder.tvItem.setText(list.get(position).getTitle());
}
@Override
public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
return new SimpleHeaderViewHolder(view);
}
@Override
public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder;
// bind your header view here
headerHolder.tvItem.setText(title);
}
}
// Create an instance of SectionedRecyclerViewAdapter
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();
// Create your sections with the list of data
TaskSection compSection = new TaskSection("Completed", compList);
TaskSection pendSection = new TaskSection("Pending", pendList);
// Add your Sections to the adapter
sectionAdapter.addSection(compSection);
sectionAdapter.addSection(pendSection);
// Set up your RecyclerView with the SectionedRecyclerViewAdapter
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(sectionAdapter);
pendSection.removeTask(task);
compSection.addTask(task);
sectionAdapter.notifyDataSetChanged();
<?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>
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])
}
}
}
}
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, parent, 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);
}
}
}