2016-03-08 10 views
7

झिलमिलाते मैं दिखाने के लिए कितना समय मेरी RecyclerView की प्रत्येक कोशिका के अंदर छोड़ दिया है ... उस के लिए मैं प्रत्येक के लिए एक उलटी गिनती टाइमर का इस्तेमाल किया है चाहता हूँ कारण बनता है। प्रत्येक पंक्ति में मैं एक काउंटर शुरू करने और onTick() प्रबंधन ... सब काम करता है के रूप में उम्मीद ... मैं प्रत्येक पंक्ति के लिए एक टाइमर टिक मिल गया है और मेरे सेल भी अपडेट कर रहा है, लेकिन मेरे सेल अब झिलमिलाते है .... और यह पागल हो जाता है जब मैं स्क्रॉल करता हूं।Recyclerview

यहाँ मेरी एडाप्टर है ...

if (product.getProductType().equalsIgnoreCase("Auction Product")) { 
       isAuction=true; 
       viewHolder.img_product_type.setImageResource(R.drawable.bid); 
       viewHolder.txt_timeleft.setVisibility(View.VISIBLE); 
       start_countDown(product.getStart(),product.getStop(),viewHolder.txt_timeleft); 
      } 

काउंटर कोड के रूप में नीचे है ....

private void start_countDown(String start, String stop, final TextView txt_timeleft) { 
     try { 
      //Log.e("hetal",start+"....."+stop); 
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

      Calendar start_date = Calendar.getInstance(); 
      start_date.setTime(format.parse(start)); 

      Calendar end_date = Calendar.getInstance(); 
      end_date.setTime(format.parse(stop)); 

      final Calendar today = Calendar.getInstance(); 
      CountDownTimer timer; 

      txt_timeleft.setTextColor(Color.DKGRAY); 
      if(today.before(start_date)){ 
       txt_timeleft.setTextColor(context.getResources().getColor(R.color.red)); 
       txt_timeleft.setText(context.getString(R.string.auction_not_start)); 
       Animation anim = new AlphaAnimation(0.0f, 1.0f); 
       anim.setDuration(1000); //You can manage the time of the blink with this parameter 
       anim.setStartOffset(20); 
       anim.setRepeatMode(Animation.REVERSE); 
       anim.setRepeatCount(Animation.INFINITE); 
       txt_timeleft.startAnimation(anim); 
       return; 
      } 
      if (!today.before(end_date)) { 

       txt_timeleft.setTextColor(context.getResources().getColor(R.color.red)); 
       txt_timeleft.setText(context.getString(R.string.time_out)); 
         Animation anim = new AlphaAnimation(0.0f, 1.0f); 
         anim.setDuration(1000); //You can manage the time of the blink with this parameter 
         anim.setStartOffset(20); 
         anim.setRepeatMode(Animation.REVERSE); 
         anim.setRepeatCount(Animation.INFINITE); 
       txt_timeleft.startAnimation(anim); 
       return; 
      } 

      timer = new CountDownTimer(end_date.getTimeInMillis(), 1000) { 
       @Override 
       public void onTick(long millisUntilFinished) { 

        Calendar calendar = Calendar.getInstance(); 
        calendar.setTimeInMillis(millisUntilFinished); 

        long diff = calendar.getTimeInMillis() - today.getTimeInMillis(); 

        long seconds = diff/1000 % 60; 
        long minutes = diff/(60 * 1000) % 60; 
        long hours = diff/(60 * 60 * 1000) % 24; 
        //long days = (int) diff/(24 * 60 * 60 * 1000); 
        long days = TimeUnit.MILLISECONDS.toDays(diff); 


        String left = ""; 
        if (days > 0) 
         left += days + " " + context.getString(R.string.txt_day) + " ,"; 
        if (hours > 0) 
         left += hours + " " + context.getString(R.string.txt_hour) + " ,"; 
        if (minutes > 0) 
         left += minutes + " " + context.getString(R.string.txt_minute) + " ,"; 

        left += seconds + " " + context.getString(R.string.txt_second); 

        final String finalLeft = left; 


          if (finalLeft.equals("0") || finalLeft.contains("-")) { 
           txt_timeleft.setText(context.getString(R.string.time_out)); 
           txt_timeleft.setTextColor(context.getResources().getColor(R.color.red)); 
           Animation anim = new AlphaAnimation(0.0f, 1.0f); 
           anim.setDuration(1000); //You can manage the time of the blink with this parameter 
           anim.setStartOffset(20); 
           anim.setRepeatMode(Animation.REVERSE); 
           anim.setRepeatCount(Animation.INFINITE); 
           txt_timeleft.startAnimation(anim); 
          } else 
           txt_timeleft.setText(finalLeft); 
       } 

       @Override 
       public void onFinish() { 

       } 
      }; 
      timer.start(); 
     }catch (Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 
+1

क्योंकि जब आप स्क्रॉल करें, यह फिर से फोन उन तरीकों और टाइमर वर्ग की नई वस्तुओं को बनाता है। –

+0

@HammadTariqSahi इसके लिए किसी भी समाधान ... क्योंकि प्रत्येक कोशिका में मैं अलग समय तो मैं onBindViewHolder –

उत्तर

3

thanx हमाद तारिक साही मैं अपने तर्क का इस्तेमाल किया और इस तरह से मेरी समस्या का समाधान है .... मैं भी मेरी अनुकूलक में इस link

संदर्भित है

ArrayList<ViewHolder> viewHoldersList; 
    private Handler handler = new Handler(); 
    private Runnable updateRemainingTimeRunnable = new Runnable() { 
     @Override 
     public void run() { 
      synchronized (viewHoldersList) { 
       for (ViewHolder holder : viewHoldersList) { 
        holder.updateTimeRemaining(); 
       } 
      } 
     } 
    }; 

मेरे एडाप्टर के निर्माता के अंदर

viewHoldersList = new ArrayList<>(); 
startUpdateTimer(); 

और इस विधि जोड़ा समय

private void startUpdateTimer() { 
     Timer tmr = new Timer(); 
     tmr.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       handler.post(updateRemainingTimeRunnable); 
      } 
     }, 1000, 1000); 
    } 

मेरी viewholder वर्ग

public void setData(Product product){ 
      this.product = product; 
     } 
     public void updateTimeRemaining() { 
      if(product.getProductType().equalsIgnoreCase("Auction Product")) { 
       Log.e("hetal",product.getProductType()); 
       try { 
        String start = product.getStart(); 
        String stop = product.getStop(); 

        //txt_timeleft.setText(""); 
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

        Calendar start_date = Calendar.getInstance(); 
        start_date.setTime(format.parse(start)); 

        Calendar end_date = Calendar.getInstance(); 
        end_date.setTime(format.parse(stop)); 

        final Calendar today = Calendar.getInstance(); 
        CountDownTimer timer; 

        long timeDiff = end_date.getTimeInMillis() - today.getTimeInMillis(); 
        if (timeDiff > 0) { 
         long seconds = timeDiff/1000 % 60; 
         long minutes = timeDiff/(60 * 1000) % 60; 
         long hours = timeDiff/(60 * 60 * 1000) % 24; 
         //long days = (int) diff/(24 * 60 * 60 * 1000); 
         long days = TimeUnit.MILLISECONDS.toDays(timeDiff); 


         String left = ""; 
         if (days > 0) 
          left += days + " " + context.getString(R.string.txt_day) + " ,"; 
         if (hours > 0) 
          left += hours + " " + context.getString(R.string.txt_hour) + " ,"; 
         if (minutes > 0) 
          left += minutes + " " + context.getString(R.string.txt_minute) + " ,"; 

         left += seconds + " " + context.getString(R.string.txt_second); 

         final String finalLeft = left; 
         txt_timeleft.setText(finalLeft); 
        } else { 
         txt_timeleft.setText("Time Out !!"); 
        } 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 

और करने के दो तरीके जोड़ा गणना करने के लिए अंत में अंदर

onBindViewHolder
synchronized (viewHoldersList) { 
       viewHolder.setData(product); 
       if(viewHoldersList.size()< (list.size()-2)) viewHoldersList.add(viewHolder); 
      } 

सही .... सभी thanx काम करता है

+0

:) अब अच्छा आनंद लें :) –

+0

क्या आप समझा सकते हैं कि क्यों आपकी सिंक्रनाइज़ विधि में आप व्यूहोल्डर को दृश्य में जोड़ते हैंहोल्डर्सलिस्ट केवल अगर (viewHoldersList.size() <(list.size() - 2) ? – Sandra

+0

मुझे अभी भी समस्याएं आ रही हैं, पाठ को तब दिखाया नहीं जाता है जब मैं अद्यतन टाइम कॉलमैनिंग कहता हूं, जैसे कि यह पुराने व्यू धारक उदाहरण का उपयोग कर रहा है, भले ही मैं ViewHoldersList.add (viewHolder) को ऑनबिंडव्यूहोल्डर – Sandra

3

आप अपने onCreateViewHolderRecyclerView की विधि में काउंट डाउन टाइमर जोड़ने की जरूरत क्योंकि onCreateViewHolder केवल एक बार बुलाया जाएगा।

onBindViewHolder हर बार उपयोगकर्ता ऊपर स्क्रॉल बुलाया जाएगा या नीचे

कोड के नीचे देखें।

public class UsageDetailsAdapter extends RecyclerView.Adapter<UsageDetailsAdapter.ViewHolder> { 

Context mContext; 
int position; 
DecoView decoView; 

public UsageDetailsAdapter(Context context) { 

    this.mContext = context; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_adapter_usage_details, parent, false); 
    decoView = (DecoView) view.findViewById(R.id.dynamicArcView); 


    Toast.makeText(mContext,""+ position, Toast.LENGTH_SHORT).show(); 


    position++; 
    return new ViewHolder(view); 


} 

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

    /* 
    * onBindViewHolder will be called every time user scroll up or down 
    * 
    * */ 


} 

@Override 
public int getItemCount() { 
    return 10; 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 

    public ViewHolder(View itemView) { 
     super(itemView); 
     decoView = (DecoView) itemView.findViewById(R.id.dynamicArcView); 
     decoView.setBackgroundColor(mContext.getResources().getColor(R.color.textColorPrimary)); 
     /* 
     * View holder will be called once, but if user scroll before completing arc view 
     * animation will not be completed. 
     * 
     * */ 
    } 
} 

}

+0

में कोड पोस्ट किया है है ठीक तो मैं कैसे इसके साथ प्रत्येक कोशिका डेटा बाँध –

+0

अपने निर्माता में स्थिति नामक एक चर इनिशिएलाइज़, यह वैश्विक कर सकते हैं और इसे क्रिएटिव्यूहोल्डर के अंत में बढ़ाएं, ताकि आप प्रत्येक सेल डेटा को संभाल सकें, और डेटा स्थिति के अनुसार प्राप्त कर सकें। –

+0

यह केवल अंतिम स्थिति देता है .... –