2017-03-31 7 views
0

안녕 내 문제는 이것과 관련이 있다고 생각합니다 notifyDataSetChanged not working on RecyclerView 메신저 내 작업을 비동기 작업에서 새로 고치려 고하지만 메신저 datasetchanged 알림을 호출 할 때 아무것도 발생하지만 어댑터 및 새 인스턴스를 만드는 경우 내가이notifydataseted 비동기 작업에서 작동하지 않습니다

public ListAdapter cardAdapter; 

처럼 참조

,이 작업 필자는 아무 소용 몇 가지를 시도하고 메신저 잘못하고 궁금해 않습니다 다음 notifydatasetchanged 전화 후 난 내 재활용보기 함께 할 모든 것을 초기화에서 onCreate에, (여기에 필요한 유일한 비트는 내 어댑터 bu를 초기화하는 방법입니다. 이러한 방법은 다음 내 재활용보기 정보를 보여줍니다하지만 내가 원하는 것은 비동기 작업의 정보를 잡아 전에 명확성을 위해 t 병이 난 목록에 항목을 추가하는 경우) 내 재활용보기로

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

을 수행하는 모든 추가 와 onPostExecute의 목록을 채울하지만 난 onPostExecute에서

cardAdapter.notifyDataSetChanged(); 

를 호출 할 때 아무것도, 어떤 도움을 어떻게하지? 어댑터를 추가

편집

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

도와 드리겠습니다. 내가이 원인이 될 수 몰랐다 내 어댑터하지만 내 질문 @red_allocator – redAllocator

+0

을 보여하지만 어떻게 내가이 – martinseal1987

답변

1

이 발생할 수 있음을 많은 이유가있다, 그 중 하나는 list 변수가 그것이 기본 인스턴스와의 잃고 어느 시점에 있기 때문에 업데이트되지 않는 것입니다 어댑터가 더 이상 수신 대기하지 않습니다. 이 경우 당신은 이제 어댑터는 RecyclerView 단지 새로운 목록이 메소드를 호출 새로 고침 할 때마다

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

같은 방법을 구현해야합니다.

+0

에 병이 포스트를에 문제가 있다고 생각하지 말아 있도록 노력하고 있습니다 언급 한 바와 같이 나에게 cardAdapter 클래스의 소스 코드 – martinseal1987

+0

를 부를 것이다하시기 바랍니다 cardAdapter.notifyDataSetChanged()를 호출하는 대신 onPostExecute; call cardAdapter.refreshMyList (newList);를 호출하십시오. – Ricardo

+0

미안 내가 그것을 시도했고, 어떤 이유로 작동을 wouldnt하지만 지금 당신의 대답은 당신에게 당신은 환영 – martinseal1987

관련 문제