2016-04-28 11 views
2

Ich möchte Abschnitte in meiner Liste implementieren. Ich habe eine Liste von Aufgaben. Liste hat einen benutzerdefinierten Adapter, der den Recyclerview-Swipe-Adapter erweitert, da ich die Swipe-Geste zur Recycler-Ansicht implementiert habe.Wie RecyclerView mit Abschnittsüberschrift je nach Kategorie zu implementieren?

So jetzt Aufgabenliste wird zusammen mit abgeschlossenen und ausstehenden Aufgaben angezeigt. Jedes Listenelement verfügt über ein Kontrollkästchen, das anzeigt, dass die Aufgabe abgeschlossen oder ausstehend ist.

Wenn das Kontrollkästchen aktiviert ist, ist die Aufgabe abgeschlossen und umgekehrt. Jetzt möchte ich zwei Abschnitte mit Kopfzeile machen. Eins für abgeschlossene Aufgaben und ein weiteres für ausstehende Aufgaben.

So abgeschlossene Aufgaben sollten innerhalb abgeschlossener Abschnitt angezeigt werden und umgekehrt. Auch wenn die Aufgabe deaktiviert ist, d. H. Ausstehend, und wenn der Benutzer das Kontrollkästchen aktiviert, sollte das Element aus dem anstehenden Abschnitt entfernt werden und dem vervollständigten Abschnitt hinzugefügt werden und umgekehrt.

Ich überprüft mit einer Bibliothek für Abschnitte.

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

Aber als ich versuchte, die Bibliothek, die ich den Fehler bekam zu implementieren, dass Adapter nicht zwei Klassen erweitern kann, wie ich recyclerview Swipe-Bibliothek vor erweitert.

Adapter:

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 Verfahren nach Verlängerung sectionedRecyclerview Adapter:

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

} 

Wie kann ich das tun? Kann mir bitte jemand helfen?

Danke ..

Antwort

1

Sie können es youself tun durch harte codding.There ar intelligente Wege, dies zu tun. Folge diesen Links. und wähle eins für dich.

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

Sie können mehr von "Schnitt recyclerViews android Bibliotheken" Du

+0

Ja, ich bin durch diese Links gegangen. Aber kann ich diese Bibliothek mit Recyclerview Swipe Library erweitern? Als ich versuchte, eines davon zu implementieren, bekam ich einen Fehler, dass die Klasse nicht mehrere Klassen erweitern kann. @ vabhi vab –

+0

Ich erhalte einen Fehler, da der Adapter die Methode onBindViewHolder (VH, int) implementieren muss, als ich versuchte, den sectionedRecyclerview-Adapter zu erweitern. Ich aktualisiere onBindViewHolder-Methode überprüfen Sie bitte. @ vabhi vab –

1

suchen kann es mit der Bibliothek implementieren SectionedRecyclerViewAdapter wie ich in diesem post erläutert.

Um das SwipeLayout zu implementieren, erweitern Sie nicht RecyclerSwipeAdapter, erweitern SecretRecyclerViewAdapter und implementieren das SwipeLayout in ItemViewHolder/onBindItemViewHolder wie Sie getan haben.

+0

wie Sie diese Zeile "mItemManger.bindView (itemViewHolder.itemView, i)" in der obigen Methode verwenden, da es sectionRecyclerview ist und keine eindeutige Position für jedes Element haben kann. – ramya

+0

Welches Objekt ist mItemManger? – Gustavo

+0

Entschuldigung, es ist ein Objekt der RecyclerSwipeAdapter Klasse dieser Bibliothek "https://github.com/daimajia/AndroidSwipeLayout" – ramya

3

Die einfachste Möglichkeit, Ihre Recycleransicht in Abschnitte aufzuteilen, besteht darin, ein Layout mit der Kopfzeile und dem bereits vorhandenen Element zu verwenden und anschließend die Sichtbarkeit zu ändern, wenn die Kopfzeile identisch ist.

Layout:

<?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> 

Adapter:

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

Was ist, wenn die Elemente im Raster sind? – Debjit

0

Werfen Sie einen Blick auf meine Bibliothek auf Github, kann verwendet werden, um leicht Abschnitte zu erstellen: 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); 

es Hoffnung hilft.

+1

Bitte posten Sie nicht einfach ein Werkzeug oder eine Bibliothek als Antwort. Zeigen Sie zumindest, wie das Problem gelöst wird (http://meta.stackoverflow.com/a/251605), in der Antwort selbst. – Rob

+2

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/17900629) – gdelab