2

여러 데이터와 카운트 다운 타이머가 포함 된 recyclerview를 만들었습니다. 내가 목록을 스크롤 할 수 없을 때까지 제대로 작동하는 모든 것들. 목록을 아래로 스크롤하면 countdowntimer가 위의보기 항목과 충돌합니다. 현재보기 시간과 임의 시간도 계산합니다. 나는 그것을 풀기에는 너무 많은 것을 시도했지만 할 수 없었다. 제발 도와주세요. 미리 감사드립니다.recyclerview의 카운트 다운 타이머가 제대로 작동하지 않습니다.

다음은 내 RecyclerAdapter 코드입니다.

public class ReferendumQuestionAdapter extends RecyclerView.Adapter<ReferendumQuestionAdapter.MyViewHolder> { 

List<QuestionsModel.QuestionsData> questionBeen = new ArrayList<>(); 
List<QuestionsModel.LikedImages> likedImagesList = new ArrayList<>(); 
Activity activity; 
boolean channerlView = false; 
OnViewClick onViewClick ; 

AppPreference preference; 
CustomDialog customDialog; 
AdminAPI adminAPI; 


ReferendumImagesAdapter imagesRecycleViewAdapter; 
List<CommentModel.GetCommentData> commentDataList = new ArrayList<>(); 
CommentViewAdapter commentViewAdapter; 

public ReferendumQuestionAdapter(List<QuestionsModel.QuestionsData> questionBeen, Activity activity, boolean channerlView , OnViewClick onViewClick) { 
    this.questionBeen = questionBeen; 
    this.activity = activity; 
    this.channerlView = channerlView; 
    this.onViewClick = onViewClick ; 
    this.preference = new AppPreference(activity); 
    this.customDialog = new CustomDialog(activity); 
    this.adminAPI = ServiceGenerator.getAPIClass(); 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.layout_referendum_question, parent, false); 
    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder, final int position) { 

    holder.txtQuestion.setText(questionBeen.get(position).getRef_question()); 
    holder.txt_channelName.setText(questionBeen.get(position).getPost_by()); 
    holder.txt_userName.setText(questionBeen.get(position).getNews_channel_name()); 

    holder.txt_views.setText(questionBeen.get(position).getTotal_view() + " View "); 
    holder.txt_comments.setText(questionBeen.get(position).getTotal_comment() + " Comment"); 
    holder.txt_referendums.setText(questionBeen.get(position).getTotal_like() + " Referendum "); 


    String getUserName = holder.txt_userName.getText().toString().trim(); 
    if(getUserName==null || getUserName.isEmpty()){ 
     holder.txt_userName.setVisibility(View.GONE); 
    } 


    String channelImageURL = questionBeen.get(position).getPost_user_image(); 
    Glide.with(activity) 
      .load(ApiURLs.IMAGE_URL + channelImageURL) 
      .error(R.drawable.noimagefound) 
      .into(holder.imgChannel); 


    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
    String startDateTime = questionBeen.get(position).getCurrent_date_time(); 
    String endDateTime = questionBeen.get(position).getEnd_date_time(); 
    Date startDate = null, endDate = null; 
    try { 
     startDate = simpleDateFormat.parse(startDateTime); 
     endDate = simpleDateFormat.parse(endDateTime); 

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

    long start_millis = startDate.getTime(); 
    long end_millis = endDate.getTime(); 
    long total_millis = (end_millis - start_millis); 

    Log.e("checkTime" , "-->" + total_millis); 

    CountDownTimer cdt = new CountDownTimer(total_millis, 1000) { 
     @Override 
     public void onTick(long millisUntilFinished) { 
      long days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished); 
      millisUntilFinished -= TimeUnit.DAYS.toMillis(days); 

      long hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished); 
      millisUntilFinished -= TimeUnit.HOURS.toMillis(hours); 

      long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished); 
      millisUntilFinished -= TimeUnit.MINUTES.toMillis(minutes); 

      long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished); 

      holder.txtTime.setText(" " + days + " D: " + hours + " H: " + minutes + " M: " + seconds + " S "); 
     } 

     @Override 
     public void onFinish() { 
      holder.txtTime.setText("Finish!"); 
      onViewClick.onClick(position); 
     } 
    }; 
    cdt.start(); 
} 
@Override 
public int getItemCount() { 
    return questionBeen.size(); 
} 

public class MyViewHolder extends RecyclerView.ViewHolder { 

    RecyclerView questionRecycle; 
    TextView txtQuestion, txtTime, txt_content, txt_userName, txt_totalComment, txt_submitComment, txt_channelName , txt_views , txt_referendums ,txt_comments; 
    ImageView imgShare, imgChannel; 
    EditText edt_comment; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     questionRecycle = (RecyclerView) itemView.findViewById(R.id.recyclerview_images); 
     txtQuestion = (TextView) itemView.findViewById(R.id.txt_question); 
     txtTime = (TextView) itemView.findViewById(R.id.txt_time); 
     txt_content = (TextView) itemView.findViewById(R.id.txt_content); 
     txt_userName = (TextView) itemView.findViewById(R.id.txt_userName); 
     txt_totalComment = (TextView) itemView.findViewById(R.id.txt_totalComment); 
     txt_submitComment = (TextView) itemView.findViewById(R.id.txt_submitComment); 
     txt_channelName = (TextView) itemView.findViewById(R.id.txt_channelName); 
     txt_views = (TextView) itemView.findViewById(R.id.txt_views); 
     txt_referendums = (TextView) itemView.findViewById(R.id.txt_referendums); 
     txt_comments = (TextView) itemView.findViewById(R.id.txt_comments); 
     imgShare = (ImageView) itemView.findViewById(R.id.img_share); 
     imgChannel = (ImageView) itemView.findViewById(R.id.img_channel); 
     edt_comment = (EditText) itemView.findViewById(R.id.edt_comment); 

    } 
} 

public interface OnViewClick { 
    void onClick(int position); 
} 

답변

1

문제는 모든 onBindViewHolder 전화에 새 CountDownTimer를 만들고 ViewHolder 것을 업데이트하는 것입니다. 따라서 두세 개의 스크롤이 끝나면 CountDownTimer은 여러 번 업데이트하려고 시도합니다. ViewHolder.

ViewHolder에 대해 CountDownTimer 하나만 만듭니다. 그렇게하려면 CountDownTimer.cancel();으로 호출 한 다음 CountDownTimerViewHolder에 새로 설정하십시오.

ViewHolder에 이미 설정되어있는 CountDownTimer에 액세스하려면 onCreateViewHolder에 만들고 MyViewHolder을 입력란으로 입력하십시오.

라는 MyViewHolder에 공개 방법은 어댑터의 onBindViewHolder 모든 당신이 onBindViewHolder에 쓴 절차 및 단순 호출 업데이트를 수행 update 말 되세요. (너무 깨끗한 코드 :)

+0

네, 잘 작동합니다. 고마워. :) –

+0

미래 세대를위한 대답으로 표시 해주세요. = P – vader

관련 문제