2016-06-06 3 views
0

각 요소 이름 근처의 해당 아이콘 (노란색으로 변경)을 탭하여 즐겨 찾기로 저장할 수있는 항목을 표시하려면 RecyclerView를 사용하고 있습니다. 더 많은 항목을로드하기 위해 내 Recyclerview 하단의 무한 ProgressBar도 사용합니다.안드로이드 문제가 recyclerview 및 즐겨 찾기

문제는 즐겨 찾기로 항목을 저장하면 다른 위치에있는 다른 아이콘이 노란색으로 변하는 것입니다. 몇 가지 테스트를 거친 후 즐겨 찾기가 내 목록과 XML 파일에 올바르게 저장 되었기 때문에 RecyclerView 문제 일 뿐이라는 것을 알아 냈습니다. 끝없는 ProgressBar가 없으면 모두 정상적으로 작동합니다.

그래서 두 개의 ViewHolder를 제대로 처리하지 못한다고 생각합니다. 그것을 고치는 방법에 대한 아이디어?

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup viewGroup, int viewType) { 
    if(pt_list.size() > 0){ 
     if (viewType == VIEW_TYPE_ITEM) { 

      View itemView = LayoutInflater. 
        from(viewGroup.getContext()). 
        inflate(R.layout.pt_item_list_layout, viewGroup, false); 
      return new ListViewHolder(itemView); 

     } else if (viewType == VIEW_TYPE_LOADING) { 
      View view = LayoutInflater.from(viewGroup.getRootView().getContext()) 
        .inflate(R.layout.pt_list_footer_loading, viewGroup, false); 
      return new LoadingViewHolder(view); 
     } 
    } 
    return null; 
} 

OnBindViewHolder :

public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 

    if (viewHolder instanceof ListViewHolder) { 

     final ListViewHolder holder = (ListViewHolder) viewHolder; 
     final PublicTransport pt = pt_list.get(holder.getAdapterPosition()); 

     holder.pt_name.setText(pt.getPt_name()); 
     holder.pt_route.setText(pt.getPt_route()); 

     //set fav_img 
     for(int i = 0; i < fav_list.size(); i++){ 
      if(fav_list.get(i).equals(pt)){ 
       holder.fav_img.setImageResource(R.drawable.ic_favorites_star_full); 
      } else{ 
       holder.fav_img.setImageResource(R.drawable.ic_favorites_star_empty); 
      } 
     } 

     //item click listener 
     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      ... 
     }); 

     //save/ delete favorites by tapping on the icon 
     holder.fav_img.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (holder.fav_img.getDrawable().getConstantState().equals(//it is not a favorite 
         ContextCompat.getDrawable(v.getContext(), 
           R.drawable.ic_favorites_star_empty).getConstantState())) { 


        if (addFav(pt)) { 
         //change icon image 
         holder.fav_img.setImageResource(R.drawable.ic_favorites_star_full); 
         //notify the user ... 
        } else { 
         //keep the same image 
         holder.fav_img.setImageResource(R.drawable.ic_favorites_star_empty) 
         //notify the user ... 
        } 

       } else {//it is a favorite 
        if (removeFav(pt)) { 
         //change icon image 
         holder.fav_img.setImageResource(R.drawable.ic_favorites_star_empty); 
         //notify the user ... 
        } else { 
         //keep the same image 
         holder.fav_img.setImageResource(R.drawable.ic_favorites_star_full); 
         //notify the user ... 
        } 

       } 
      } 
     }); 

    } else if (viewHolder instanceof LoadingViewHolder) {//endless ProgressBar 
     LoadingViewHolder loadingViewHolder = (LoadingViewHolder) viewHolder; 
     loadingViewHolder.progressBar.setIndeterminate(true); 
    } 
} 

당신이 필요로하는 경우, 여기 내 활동에서 ProgressBar 구현은 다음과 같습니다

publicTransportListAdapter.setOnLoadMoreListener(new OnLoadMoreListener() { 
     @Override 
     public void onLoadMore() { 
      //add ProgressBar to RecyclerView 
      pt_list.add(null); 
      publicTransportListAdapter.notifyItemInserted(pt_list.size() - 1); 

      //Load more data for recyclerview 
      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        //load more items from server (via thread) 
        loadMore(); 

        //remove ProgressBar 
        pt_list.remove(pt_list.size() - 1); 
        publicTransportListAdapter.notifyItemRemoved(pt_list.size()); 

       } 
      }, 2000); 
     } 
    }); 

답변

1

문제는 항목이 마음에 드는 기반으로하는 경우 확인하려는 것입니다 fav_img 드로어 블 :

if (holder.fav_img.getDrawable().getConstantState().equals(//it is not a favorite 
        ContextCompat.getDrawable(v.getContext(), 
          R.drawable.ic_favorites_star_empty).getConstantState())) 

RecyclerView는 이름에서 알 수 있듯이보기를 재활용하므로 마음에 들지 않는 항목에 대한 즐겨 찾기 항목의보기를 수신 할 수 있으며 잘못된 값을 반환합니다.

PublicTransport pubTransp = pt_list.get(holder.getAdapterPosition()); 
for(int i = 0; i < fav_list.size(); i++){ 
    if(fav_list.get(i).equals(pubTransp)){ 
     // check if it is favorite 
    } 
} 
+0

심지어 consodered 있지 않습니다이 문제가되었습니다 수 : 항목이 좋아하는 경우에 당신이 당신의 fav_list에 확인해야 OnClickListener를의 문제를 해결하기 위해

. 당신의 팁은 내 문제를 해결했습니다, 고마워요. – Cala