2016-04-28 8 views
2

Я хочу реализовать разделы в моем списке. У меня есть список задач. Список имеет пользовательский адаптер, который расширяет recyclerview swipe adapter, так как я реализовал жестов салфетки в recyclerview.Как реализовать RecyclerView с заголовком раздела в зависимости от категории?

Итак, теперь список задач отображается вместе с завершенными и ожидающими выполнения задачами. В каждом элементе списка установлен флажок, который показывает, что задача завершена или ожидает выполнения.

Если установлен флажок, задача завершена и наоборот. Теперь я хочу сделать два раздела с заголовком. Один для завершенных задач и другой для ожидающих задач.

Выполненные задачи должны быть показаны внутри завершенной секции и наоборот. Кроме того, если задача не отмечена, а затем, если пользователь проверяет флажок, элемент должен быть удален из раздела ожидания и должен быть добавлен в завершенный раздел и наоборот.

Я проверил одну библиотеку для разделов.

https://github.com/afollestad/sectioned-recyclerview

Но когда я попытался реализовать библиотеку я получил ошибку, что адаптер не может продлить два класса, как я, прежде чем расширить библиотеку recyclerview салфетки.

адаптер:

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; 
    } 
} 

EDIT:

onBindViewHolder метод после расширения sectionedRecyclerview адаптера:

@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, "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); 

} 

Как я могу это сделать? Может ли кто-нибудь помочь с этим, пожалуйста?

Спасибо ..

ответ

1

Вы можете сделать это сами жесткими codding.There ар умных способов сделать это. следуйте этим ссылкам. и выберите один для вас.

https://github.com/afollestad/sectioned-recyclerview https://github.com/truizlop/SectionedRecyclerView http://android-pratap.blogspot.in/2015/12/sectioned-recyclerview-in-android_1.html

Вы можете искать больше, "секционного recyclerViews андроид библиотеки"

+0

Да, я прошел через эти ссылки. Но могу ли я расширить эту библиотеку с помощью библиотеки recyclerview swipe? Когда я попытался реализовать один из них, я получил ошибку, которую класс не может расширить несколько классов. @vabhi vab –

+0

Я получаю сообщение об ошибке, так как адаптер должен реализовать метод onBindViewHolder (VH, int), когда я пытался расширить адаптер sectionedRecyclerview. Я обновляю метод onBindViewHolder, пожалуйста, проверьте. @vabhi vab –

1

Вы можете реализовать его с библиотекой SectionedRecyclerViewAdapter, как я объяснил в этом post.

Чтобы реализовать SwipeLayout, не расширяйте RecyclerSwipeAdapter, расширяйте SectionedRecyclerViewAdapter и реализуйте SwipeLayout в ItemViewHolder/onBindItemViewHolder, как вы это сделали.

+0

как использовать эту строку «mItemManger.bindView (itemViewHolder.itemView, i)» в вышеуказанном методе, так как это sectionRecyclerview и не может иметь уникальную позицию для каждого элемента. – ramya

+0

Какой объект mItemManger? – Gustavo

+0

извините его за объект класса RecyclerSwipeAdapter в этой библиотеке «https://github.com/daimajia/AndroidSwipeLayout» – ramya

3

Самый простой способ разделить вид вашего ресайклера на разделы - использовать макет с заголовком, а элемент уже на месте, а затем изменить видимость, если заголовок тот же.

Планировка:

<?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/text_header" 
     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/text_name" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/text_header" 
     android:background="?android:attr/selectableItemBackground" 
     android:padding="16dp" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     tools:text="Adam" /> 

</RelativeLayout> 

адаптер:

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); 
     } 
    } 
} 
+0

Как насчет того, если элементы находятся в сетке? – Debjit

0

Посмотрите на мою библиотеку на Github, могут быть легко использованы для создания разделов: RecyclerAdapter & Easy Section

mRecylerView.setLayoutManager(...); 
/*create Adapter*/ 
RecyclerAdapter<Customer> baseAdapter = new RecyclerAdapter<>(...); 
/*create sectioned adapter. the Adapter type can be RecyclerView.Adapter*/ 
SectionedAdapter<String, RecyclerAdapter> adapter = new SectionedAdapter<>(SectionViewHolder.class, baseAdapter); 
/*add your sections*/ 
sectionAdapter.addSection(0/*position*/, "Title Section 1"); 
/*attach Adapter to RecyclerView*/ 
mRecylerView.setAdapter(sectionAdapter); 

Надежда это помогает.

+1

Пожалуйста, не просто отправляйте какой-либо инструмент или библиотеку в качестве ответа. По крайней мере, продемонстрируйте [как он решает проблему] (http://meta.stackoverflow.com/a/251605) в самом ответе. – Rob

+2

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/17900629) – gdelab