에서 특정 항목을 새로 고치려고합니다 RecyclerView
.
스토리 : 사용자가 항목을 클릭 할 때마다 AlertDialog
. 사용자는 확인 버튼을 클릭하여 텍스트를 입력 할 수 있습니다. 나는이 항목에서이 텍스트를 표시하려면 보이지 않는 보여 ImageView
– XML 및 어댑터를 선언 ViewHolder
–
AlertDialog
항목을 업데이트하기 위해 Positive Button 에서이 기능을 사용했습니다 .
private void updateListItem(int position) {
View view = layoutManager.findViewByPosition(position);
ImageView medicineSelected = (ImageView) view.findViewById(R.id.medicine_selected);
medicineSelected.setVisibility(View.VISIBLE);
TextView orderQuantity = (TextView) view.findViewById(R.id.order_quantity);
orderQuantity.setVisibility(View.VISIBLE);
orderQuantity.setText(quantity + " packet added!");
medicinesArrayAdapter.notifyItemChanged(position);
}
그러나이 코드는 전달 된 위치에서 itemView를 변경할뿐만 아니라 다른 itemView (s)도 변경합니다!
특정 itemView를 클릭하여 올바르게 변경하려면 어떻게해야합니까?
답변
notifyItemChanged(int position)
RecyclerView.Adapter 클래스 의 메서드를 사용할 수 있습니다 . 문서에서 :
등록 된 관찰자에게 위치의 항목이 변경되었음을 알립니다. notifyItemChanged (position, null); 호출과 동일합니다.
이것은 구조 변경 이벤트가 아니라 항목 변경 이벤트입니다. 위치에있는 데이터의 반영이 오래되어 업데이트해야 함을 나타냅니다. 위치의 항목은 동일한 ID를 유지합니다.
당신이 이미 그 위치를 가지고 있기 때문에 그것은 당신을 위해 일할 것입니다.
답변
단일 항목 업데이트
- 데이터 항목 업데이트
- 어댑터에 변경 사항을 알리십시오.
notifyItemChanged(updateIndex)
예
“I like sheep”이라고 표시되도록 “Sheep”항목을 변경합니다.
String newValue = "I like sheep.";
int updateIndex = 3;
data.set(updateIndex, newValue);
adapter.notifyItemChanged(updateIndex);
더 많은 예제와 함께 나의 완전한 대답은 여기에 있습니다 .
답변
모델 데이터 목록에 변경된 텍스트 추가
mdata.get(position).setSuborderStatusId("5");
mdata.get(position).setSuborderStatus("cancelled");
notifyItemChanged(position);
답변
나는 이것을 처리하는 방법에 대한 아이디어가 있다고 생각합니다. 업데이트는 정확한 위치에서 삭제하고 바꾸는 것과 같습니다. 따라서 먼저 아래 코드를 사용하여 해당 위치에서 항목을 제거합니다.
public void removeItem(int position){
mData.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, mData.size());
}
그런 다음 아래와 같이 특정 위치에 항목을 추가합니다.
public void addItem(int position, Landscape landscape){
mData.add(position, landscape);
notifyItemInserted(position);
notifyItemRangeChanged(position, mData.size());
}
지금 구현하려고합니다. 완료되면 피드백을 드리겠습니다!
답변
수정해야하는 항목의 위치를 파악한 다음 어댑터 호출에서이 문제를 해결해야합니다.
public void refreshBlockOverlay(int position) {
notifyItemChanged(position);
}
,이 특정 위치에서이 특정 항목에 대해 onBindViewHolder (ViewHolder holder, int position)를 호출합니다.
답변
아래 솔루션이 저에게 효과적이었습니다.
RecyclerView 항목에서 사용자는 버튼을 클릭하지만 TextView와 같은 다른보기는 어댑터에 직접 알리지 않고 업데이트됩니다.
notifyDataSetChanged () 메서드를 사용하지 않고 이에 대한 좋은 해결책을 찾았습니다.이 메서드는 recyclerView의 모든 데이터를 다시로드하므로 항목 내부에 이미지 또는 비디오가 있으면 다시로드되고 사용자 경험이 좋지 않습니다.
다음은 ImageView like 아이콘을 클릭하고 단일 TextView (같은 항목의 동일한 방식으로 더 많은보기를 업데이트 할 수 있음) 만 업데이트하여 +1을 추가 한 후 개수 업데이트처럼 표시하는 예입니다.
// View holder class inside adapter class
public class MyViewHolder extends RecyclerView.ViewHolder{
ImageView imageViewLike;
public MyViewHolder(View itemView) {
super(itemView);
imageViewLike = itemView.findViewById(R.id.imageViewLike);
imageViewLike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = getAdapterPosition(); // Get clicked item position
TextView tv = v.getRootView().findViewById(R.id.textViewLikeCount); // Find textView of recyclerView item
resultList.get(pos).setLike(resultList.get(pos).getLike() + 1); // Need to change data list to show updated data again after scrolling
tv.setText(String.valueOf(resultList.get(pos).getLike())); // Set data to TextView from updated list
}
});
}
답변
개인적으로 효과가 있었던 방법은 recyclerview의 어댑터 메서드를 사용하여 항목의 변경 사항을 처리하는 것입니다.
이와 유사한 방식으로 사용자 지정 재활용 기의보기에서 다음과 같은 메서드를 생성합니다.
public void modifyItem(final int position, final Model model) {
mainModel.set(position, model);
notifyItemChanged(position);
}