2017-10-04 2 views
1

RecyclerView에서 행의 특정 뷰를 변경하는 방법. Adapter.notifyDataSetChanged 또는 Adapter.notifyItemChanged 업데이트 행 하지만이 행의 다른보기를 건드리지 않고 행의 특정보기를 변경해야합니다.리사이클 러 뷰에서 행의 특정 항목 변경

+1

보기로 어떤 수단이 있습니까? 죄송합니다. 질문을받습니다. 행 라벨, 버튼 색상 또는 전체 행 스타일을 변경 하시겠습니까? 또는 전체보기를 다른 레이아웃 xml로 변경 하시겠습니까? –

+0

안녕 비슈누 KR! 두 개의 imageView와 두 개의 textView가 있습니다. 사용자가 행을 클릭 할 때마다 모든 행의이 textVIews 중 하나에서 텍스트가 변경되기를 원합니다. 그러나 문제는 다른 imageView가 Picasso 라이브러리를 통해 소스를 얻는다는 것입니다. 그리고 notifyDataSetChanged 등을 통해 텍스트를 변경할 때마다 Picasa는 imageView를 업데이트하고 사용자에게 표시됩니다. 이 문제가 발생하지 않도록하고 싶습니다. 문제는 다음과 같습니다. 전체 행을 만지지 않고 행의 특정보기를 어떻게 바꿀 수 있습니까? –

+0

Haah .. 그 이미지를 바로 다시로드한다는 것을 말하고있는 것입니다. 그래서 당신은 이미지 캐싱 기법을 사용할 필요가 있다고 생각합니다. 피카소는 이미지가 이미로드되어있는 경우 이미지를 다시로드하지 않습니다. 또는 다음 옵션은 항목 모델 내의 태그를 사용하여 이미지를 보이거나 숨김으로써 차단하는 것입니다. –

답변

0

먼저 다음을 사용 Glide (구글에 의해)를 사용할 수 있습니다. 더 효율적입니다.

둘째, 캐시 메모리에 이미있는 이미지는 다시 다운로드되지 않습니다.

이제 목록에서 데이터를 변경 한 다음 어댑터 또는 리사이클 러보기를 업데이트하면됩니다. 당신의 AdapterClass

인터페이스를 만들기 내부

,의는

public interface TheUpdater{ 
    public void updateMyAdapter(int position); 
} 

이 그런 다음 활동에서이 인터페이스를 구현하고,이 메소드를 오버라이드 (override) 가정 해 봅시다.

이제보기의 위치를 ​​가져 오려면 다음을 수행하십시오.

보기 (단추 또는 전체 부모보기, 즉 레이아웃)의 onClick()을 무시하고 다음 문을 수행 할 수 있습니다.

mTappedPosition = getAdapterPosition(); 

listener.updateMyAdapter(mTappedPosition); //Update the adapter 

여기에서 mTappedPosition은 글로벌 변수입니다. 당신의 활동

@Override 
updateMyAdapter(int position){ 
---- //Do stuff 
mAdapter.notifyItemSetChanged(position); 
} 
+0

알아,하지만 문제는 ImageView가 Picasso를 통해 소스를 다운로드하고 notifyDatasetChanged Picasso를 설정할 때마다 다운로드한다는 것이다. 그림 및이 업데이트가 사용자에게 표시되는 것을 막으려 고합니다. –

+0

어댑터 내부에서 뷰의 위치를 ​​얻을 수 있습니까? 그렇다면, 나는 그것을위한 해결책을 가지고있다. – Dennis

+0

예, 변경 사항을 적용 할 때 위치를 얻을 수 있습니다. –

0

대신 피카소의 코드 모든

MyRecyclerAdapter.ViewHolder viewHolder= (MyRecyclerAdapter.ViewHolder) recycleView.findViewHolderForAdapterPosition(1); 
    viewHolder.txtView.SetText("Some Text"); 
+0

내가 전에 언급했듯이, –

+0

pls는 업데이트 된 코드를 시도한다 – Manish

+0

좋아, 단지 한 순간에 –

0

내부

나는 당신이 이미지 캐싱 기술을 사용해야하는 이미지 로딩 문제를 방지 생각합니다. 따라서 이미로드 된 이미지는 다시로드되지 않습니다.

또는 이미지가 이미로드되어있는 경우

및 각각의 모든 행은 당신이 당신의 itemModel (어댑터 항목의 데이터가있는 DTO)에 부울 플래그를 유지할 수 있습니다 설정 같은 이미지를 보여주고있다. 해당 모델을 변경 한 다음 전화하십시오

yourListToAdapter(index).setFlag(showImage1); // showImage1 boolean flag 

yourAdapter.notifyItemChanged(index); 
관련 문제