2017-03-31 2 views
0

Hallo ich denke, mein Problem bezieht sich auf diese notifyDataSetChanged not working on RecyclerView Ich versuche, mein Layout von einem asynchronen Task zu aktualisieren, aber wenn ich benachrichtigen datasetchanged passiert nichts, aber wenn ich eine neue Instanz des Adapters erstellen und rufen notifydatasetchanged dann funktioniert es ive ein paar Dinge ohne Erfolg versucht, und frage mich, was im falsch zu machen,notifydatasetchanged funktioniert nicht von async Aufgabe

ich es verweisen wie dieser

public ListAdapter cardAdapter; 

dann in onCreate ich alles initialisieren mit meiner Recycler Blick zu tun, (Das einzige Bit, das hier benötigt wird, ist, wie ich meinen Adapter bu initialisiere t für Klarheit krank alles fügt mit meiner Recycler Ansicht)

staggeredGridLayoutManagerVertical = new 
    customLinearLayoutManager(this,customLinearLayoutManager.VERTICAL,false); 
    recyclerView = (RecyclerView) findViewById(R.id.list_view); 
    OnItemTouchListener itemTouchListener = new  
    FinalListActivity.OnItemTouchListener() { 
     @Override 
     public void onCardClick(View view, int position) { 
      //removeAt(position); 
      list.remove(position); 
      cardAdapter.notifyItemRemoved(position); 
     } 

     @Override 
     public void onCardLongClick(View view, int position) { 
      //clearGrid(); 
     } 
    }; 
    cardAdapter = new ListAdapter(list,this,itemTouchListener); 
    recyclerView.setLayoutManager(staggeredGridLayoutManagerVertical); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(cardAdapter); 
    //cardAdapter.notifyDataSetChanged(); 

    ItemTouchHelper.Callback callback = 
      new SimpleItemTouchHelperCallback(cardAdapter); 
    mItemTouchHelper = new ItemTouchHelper(callback); 
    mItemTouchHelper.attachToRecyclerView(recyclerView); 

zu tun, wenn ich Elemente zur Liste hinzufügen, bevor diese Methoden dann meine Recycler Ansicht, welche die Information zeigt aber, was ich will, ist die Information in einer Asynchron-Aufgabe zu packen und füllen Sie die Liste in onPostExecute, aber wenn ich rufe

cardAdapter.notifyDataSetChanged(); 

von onPostExecute nichts passiert, irgendeine Hilfe?

EDIT Hinzufügen des Adapters

public class ListAdapter extends 
RecyclerView.Adapter<ListAdapter.MyViewHolder> 
implements ItemTouchHelperAdapter{ 
private List<String> cardMakerList; 
private OnStartDragListener mDragStartListener; 
private FinalListActivity.OnItemTouchListener onItemTouchListener; 

public class MyViewHolder extends RecyclerView.ViewHolder{ 
    public EditText cardText; 
    public ImageView close; 
    public ContentLoadingProgressBar progress; 
    public ImageView handleView; 
    public RelativeLayout cardBack; 

    public MyViewHolder(View view){ 
     super(view); 
     cardText = (EditText) view.findViewById(R.id.cardText); 
     close = (ImageView) view.findViewById(R.id.close); 
     cardBack =(RelativeLayout)view.findViewById(R.id.cardLayout); 
     close.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onItemTouchListener.onCardClick(v, getPosition()); 
      } 
     }); 
     /* 
     close.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       onItemTouchListener.onCardLongClick(v, getPosition()); 
       return true; 
      } 
     }); 
     */ 
     progress = (ContentLoadingProgressBar) 
     view.findViewById(R.id.progress); 
     handleView = (ImageView)view.findViewById(R.id.handle); 
    } 

} 
public ListAdapter(List<String> cardMakerList,OnStartDragListener 
dragStartListener,FinalListActivity.OnItemTouchListener onItemTouchListener) 
{ 
    this.cardMakerList = cardMakerList; 
    mDragStartListener = dragStartListener; 
    this.onItemTouchListener = onItemTouchListener; 
} 
@Override 
public boolean onItemMove(int fromPosition, int toPosition) { 
    if (fromPosition < toPosition){ 
     for (int i = fromPosition; i < toPosition; i++){ 
      Collections.swap(cardMakerList,i,i+1); 
     } 
    }else{ 
     for (int i = fromPosition; i > toPosition; i--){ 
      Collections.swap(cardMakerList,i,i-1); 
     } 
    } 
    notifyItemMoved(fromPosition,toPosition); 
    return true; 
} 
@Override 
public void onItemDismiss(int position) { 
    cardMakerList.remove(position); 
    notifyItemRemoved(position); 
} 
@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.card_view_holder, parent, false); 
    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder, final int position) 
{ 
    String cardString = cardMakerList.get(position); 
    holder.cardText.setText(cardString); 
    holder.handleView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (MotionEventCompat.getActionMasked(event) == 
        MotionEvent.ACTION_DOWN) { 
       mDragStartListener.onStartDrag(holder); 
      } 
      return false; 
     } 
    }); 
    holder.close.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      //cardMakerList.remove(position); 
      return false; 
     } 
    }); 
} 
@Override 
public int getItemCount(){ 
    return cardMakerList.size(); 
} 
} 
+0

Ich möchte Ihnen helfen. Bitte zeigen Sie mir cardAdapter Klasse Quellcode – redAllocator

+0

wie erwähnt es funktioniert, so glaube ich nicht, es gibt ein Problem in meinem Adapter, aber krank Post es in meine Frage @red_allocator – martinseal1987

Antwort

1

Es gibt viele Gründe dafür, dass dies auftreten könnte, und einer von ihnen ist die list Variable wird zu einem bestimmten Zeitpunkt aktualisiert wird es nicht, weil es verliert primäre Instanz ist und die Adapter hört nicht mehr darauf. In diesem Fall sollten Sie in Ihrem Adapter eine Methode, wie

public void refreshMyList(List<String> list){ 
    this.cardMakerList.clear(); 
    this.cardMakerList.addAll(list); 
    this.notifyDataSetChanged(); 
} 

Jetzt jedes Mal, wenn die RecyclerView gerade diese Methode mit der neuen Liste aufrufen aktualisieren möchten implementieren.

+0

Ich hatte keine Ahnung, dass dies eine Ursache sein könnte, aber wie würde ich dies – martinseal1987

+0

nennen onPostExecute statt cardAdapter.notifyDataSetChanged(); Anruf cardAdapter.refreshMyList (newList); – Ricardo

+0

Entschuldigung, ich habe es versucht und aus irgendeinem Grund würde es nicht funktionieren, aber es ist jetzt und Ihre Antwort hat mein Problem gelöst alles funktioniert genau so, wie es Ihnen vielmals danken sollte – martinseal1987

Verwandte Themen