45

RecyclerView kullanarak görüntülemek için kartların bir listesini oluşturuyorum, burada her kartın bu kartı listeden kaldırmak için bir düğmesi vardır. i RecyclerView kartı çıkarmak için()notifyItemRemoved kullandığınızdanotifyItemRemoved veya notifyDataSetChickged with RecyclerViewChanged with Android

, bu öğeyi kaldırır ve ince canlandıran ancak listede verileri doğru güncellenen değildir.

bunun yerine, ben notifyDataSetChanged() sonra listedeki öğeler kaldırılır ve doğru olarak güncellenen, ama sonra kartları animasyon yok geçerseniz.

Birisi notifyItemRemoved() öğesini kullanma konusunda herhangi bir deneyimi var ve notifyDataSetChanged dışında neden farklı davrandığını biliyor mu? @pskink olarak

private List<DetectedIssue> issues = new ArrayList<DetectedIssue>(); 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    // - get element from your dataset at this position 
    // - replace the contents of the view with that element 
    if(position >0){ 
     RiskViewHolder riskHolder = (RiskViewHolder)holder; 
     final int index = position - 1; 
     final DetectedIssue anIssue = issues.get(index); 

     riskHolder.button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        int index = issues.indexOf(anIssue); 
        issues.remove(anIssue); 
        notifyItemRemoved(index); 

        //notifyDataSetChanged(); 
       } catch (SQLException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

@Override 
public int getItemCount() { 
    return (issues.size()+1); 
} 
+2

olduğu (index + 1) – pskink

+0

Farklı dizinler kaldırılıyor –

+1

Dizin doğru. NotifyDataSetChanged() yerine ..... – revolutionary

cevap

1

o notifyItemRemoved(index+1) ile benim durumumda (index + 1) olması gerekiyordu önerdi, ben üst endeksi rezerve ediyorum muhtemelen çünkü: Burada

i kullanıyorum kod bazı peiece olduğunu Bir başlık için position=0.

Sen ViewHolder sınıfında kaldır dinleyicisi eklemek gerekir
-2

button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

        onCancel(getAdapterPosition()); 

      } 
     }); 

    private void onCancel(int position) { 
     if (position >= issues.size()) 
      return; 
     issues.remove(position); 
     notifyItemRemoved(position); 
    } 
61

Kullanım notifyItemRangeChanged (pozisyon, getItemCount()); NotifyItemRemoved (konum) sonrası;
İndeks kullanmanıza gerek yok, sadece pozisyonu kullan. Aşağıdaki kodlara bakın.

private List<DetectedIssue> issues = new ArrayList<DetectedIssue>(); 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    // - get element from your dataset at this position 
    // - replace the contents of the view with that element 
    if(position >0){ 
     RiskViewHolder riskHolder = (RiskViewHolder)holder; 

     riskHolder.button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        issues.remove(position); 
        notifyItemRemoved(position); 
        //this line below gives you the animation and also updates the 
        //list items after the deleted item 
        notifyItemRangeChanged(position, getItemCount()); 

       } catch (SQLException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 

@Override 
public int getItemCount() { 
    return issues.size(); 
} 
+0

Dökümantasyondan: "Bu metot içinde sadece ilgili veriyi alırken pozisyon parametresini kullanmalısınız ve bir kopyasını saklamamalısınız. Bir öğenin konumunun daha sonra açık olması gerekiyorsa (örneğin bir tıklama dinleyicisinde), RecyclerView kullanın Güncellenmiş bağdaştırıcı konumuna sahip olan .ViewHolder.getAdapterPosition(). " –

+0

@Akshay Mahajan Eski ileti dizisi üzgün, ama 'notifyItemRemoved (position);' sadece (animasyon ile) sadece iyi çalışıyor. Ne notifyItemRangeChanged (position, getItemCount()); 'yapıyor? Farkı göremiyorum. Teşekkür ederiz –

+0

getItemCount() - konumu olmamalıdır, itemCount kaldırılan öğeden sonra öğelerin sayısını ifade eder. –

5

benim hatam, notifyItemChanged (pozisyon) pozisyonun madde kaldırılabilir, çaresiz olduğunu ve pozisyon madde + 1 iyi, ama ürün pozisyon + 2 başlamak, alacağınız İstisna, lütfen notifyItemRangeChanged kullanın (position, getItemCount()); 'dan sonra notifyItemRemoved (position); Böyle

:

public void removeData(int position) { 
    yourdatalist.remove(position); 
    notifyItemRemoved(position); 
    notifyItemRangeChanged(position,getItemCount()); 
} 
+1

lütfen bunu yaparak nelerin değişeceğine ve sorunun nasıl çözüleceğine ilişkin ayrıntıları sağlayın. – AndroidMechanic

10

public void removeItem(int position) { 
    this.taskLists.remove(position); 
    notifyItemRemoved(position); 
    notifyItemRangeChanged(position, getItemCount() - position); 
} 

çalıştı ve bir cazibe gibi çalışıyor. sen Muhtemelen çünkü RecyclerView.ViewHolder

getLayoutPosition() den getLayoutPosition() kullanabilirsiniz

0

düzeninde öğenin tam pozisyonunu sağlar ve kod notifyItemRemoved deneyin

holder.removeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Position for remove 
       int modPosition= holder.getLayoutPosition(); 
       //remove item from dataset 
       numbers.remove(modPosition); 
       //remove item from recycler view 
       notifyItemRemoved(modPosition); 
      } 
     }); 
+0

GetAdapterPosition öğesini [document] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getLayoutPosition()) durumları olarak kullanmalısınız, oluşturma riski altındasınız demektir tutarsızlıklar. –

0
**my solution looks like this** 

this way is unnecessary to use the heavy method: 
//notifyItemRangeChanged(xx,xx) 

/** 
* 
* recyclerView的item中的某一个view,获取其最外层的viewParent,也就是item对应的layout在adapter中的position 
* 
* @param recyclerView 
* @param view:can be the deep one inside the item,or the item itself . 
* @return 
*/ 
public static int getParentAdapterPosition(RecyclerView recyclerView, View view, int parentId) { 
    if (view.getId() == parentId) 
     return recyclerView.getChildAdapterPosition(view); 
    View viewGroup = (View) view.getParent(); 
    if (viewGroup != null && viewGroup.getId() == parentId) { 
     return recyclerView.getChildAdapterPosition(viewGroup); 
    } 
    //recursion 
    return getParentAdapterPosition(recyclerView, viewGroup, parentId); 
} 




//wherever you set the clickListener . 
holder.setOnClickListener(R.id.rLayout_device_item, deviceItemClickListener); 
holder.setOnLongClickListener(R.id.rLayout_device_item, deviceItemLongClickListener); 


@Override 
public boolean onLongClick(View v) { 
    final int position = ViewUtils.getParentAdapterPosition(rVDevicesList, v, R.id.rLayout_device_item); 
    return true; 
}