2017-05-08 71 views
0

我已經創建了與sr,名稱,按鈕和計時器(textview)的列表視圖。我只希望按鈕必須是倒計時結束後才能點擊。問題是即使倒計時正在進行,按鈕是可點擊的。按鈕不能點擊,直到時間結束。 以下是我的代碼 -listview裏面的按鈕幾秒後可點擊

MainActivity.java

public class MainActivity extends Activity { 
    Button btnnext; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btnnext=(Button)findViewById(R.id.btn1); 
     btnnext.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent i=new Intent(MainActivity.this,Second.class); 
       startActivity(i); 

      } 
     }); 
    } 
} 

Model.java

public class Model { 

    int sr; 
    String name; 
    long expirationTime; 

    public Model(int sr, String name,long expirationTime) { 
     this.sr = sr; 
     this.name = name; 
     this.expirationTime = expirationTime; 
    } 


    public int getSr() { 
     return sr; 
    } 

    public void setSr(int sr) { 
     this.sr = sr; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public long getExpirationTime() { 
     return expirationTime; 
    } 

    public void setExpirationTime(long expirationTime) { 
     this.expirationTime = expirationTime; 
    } 
} 

Second.java

public class Second extends Activity{ 

TextView txtsrno,txtflower,txtstatus,txttimer,txttimeleft; 
    ListView listView; 
    ArrayList<Model> flowerlist; 


    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.second); 
     txtsrno = (TextView) findViewById(R.id.srno); 
     txtflower = (TextView) findViewById(R.id.name); 
     txtstatus = (TextView) findViewById(R.id.buy); 
     txttimeleft=(TextView)findViewById(R.id.remtime); 






       listView = (ListView) findViewById(R.id.list); 
       flowerlist = new ArrayList<>(); 

       flowerlist.add(new Model(1, "Rose",System.currentTimeMillis() + 100000)); 
       flowerlist.add(new Model(2, "Sunflower",System.currentTimeMillis() + 10000)); 
       flowerlist.add(new Model(3, "Lotus",System.currentTimeMillis() + 30000)); 
       flowerlist.add(new Model(4, "Jasmine",System.currentTimeMillis() + 20000)); 

       SecondCustom sc = new SecondCustom(this, flowerlist); 
       listView.setAdapter(sc); 


      } 
} 

SecondCustom.java

public class SecondCustom extends BaseAdapter { 
    Activity a; 
    ArrayList<Model> flowerlist; 
    private List<Viewholder> lstHolders; 
    long timeDiff; 


    private LayoutInflater lf; 
    private Handler mHandler = new Handler(); 
    private Runnable updateRemainingTimeRunnable = new Runnable() { 
     @Override 
     public void run() { 
      synchronized (lstHolders) { 
       long currentTime = System.currentTimeMillis(); 
       for (Viewholder holder : lstHolders) { 
        holder.updateTimeRemaining(currentTime); 
       } 
      } 
     } 
    }; 



    public SecondCustom(Activity a, ArrayList<Model> flowerlist) { 
     this.a = a; 
     this.flowerlist = flowerlist; 
     lstHolders = new ArrayList<>(); 
     startUpdateTimer(); 
    } 


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



    @Override 
    public int getCount() { 
     return flowerlist.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return flowerlist.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    public class Viewholder{ 
     TextView srno,name,ltime; 
     Button buy; 
     Model mModel; 


     public void setData(Model item) { 
      mModel = item; 
      name.setText(item.name); 
      updateTimeRemaining(System.currentTimeMillis()); 
     } 

     public void updateTimeRemaining(long currentTime) { 
      long timeDiff = mModel.expirationTime - currentTime; 
      if (timeDiff > 0) { 
       int seconds = (int) (timeDiff/1000) % 60; 
       int minutes = (int) ((timeDiff/(1000 * 60)) % 60); 
       int hours = (int) ((timeDiff/(1000 * 60 * 60)) % 24); 
       ltime.setText(hours +":" + minutes +":" + seconds); 

      } else { 

       ltime.setText("Buy Now!!"); 
      } 
     } 
    } 

    @Override 
    public View getView(final int i, View convertView, ViewGroup viewGroup) { 
     Viewholder viewholder = null; 
     if (convertView == null) { 
      viewholder = new Viewholder(); 
      LayoutInflater li=a.getLayoutInflater(); 
      convertView = li.inflate(R.layout.secondcustom, viewGroup, false); 
      viewholder.srno = (TextView) convertView.findViewById(R.id.sr); 
      viewholder.name = (TextView) convertView.findViewById(R.id.flow); 
      viewholder.buy = (Button) convertView.findViewById(R.id.st); 
      viewholder.ltime = (TextView) convertView.findViewById(R.id.lefttime); 
      convertView.setTag(viewholder); 
      synchronized (lstHolders) { 
       lstHolders.add(viewholder); 
      } 
     }else { 
       viewholder = (Viewholder) convertView.getTag(); 
      } 

      viewholder.setData((Model) getItem(i)); 


      final Model model=flowerlist.get(i); 
     viewholder.srno.setText(valueOf(flowerlist.get(i).getSr())); 
     viewholder.name.setText(valueOf(flowerlist.get(i).getName())); 
     viewholder.ltime.setText(valueOf(flowerlist.get(i).getExpirationTime())); 



      if(timeDiff==0) { 
       viewholder.buy.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         Toast.makeText(a, "Purchased" + " " + flowerlist.get(i).getName(), Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 


     return convertView; 
    } 
} 
+0

原樣使用view.onclicklistener,只是當計時器正在運行時調用view.setclickable(false)並在計時器停止後調用view.setclickable(true) –

+0

如何實現該代碼?是否可以給我確切的代碼plz。 – Neha

+0

你想在timeDiff變成0時點擊按鈕吧? –

回答

0

只是改變這個方法:

public void updateTimeRemaining(long currentTime) { 
      long timeDiff = mModel.expirationTime - currentTime; 
      if (timeDiff > 0) { 
       int seconds = (int) (timeDiff/1000) % 60; 
       int minutes = (int) ((timeDiff/(1000 * 60)) % 60); 
       int hours = (int) ((timeDiff/(1000 * 60 * 60)) % 24); 
       ltime.setText(hours +":" + minutes +":" + seconds); 

       buy.set.setClickable(false); 

      } else { 
       buy.set.setClickable(true); 
       ltime.setText("Buy Now!!"); 
      } 
     } 

而在此代碼,刪除如果條件只是調用點擊監聽器:

if(timeDiff==0) { 
       viewholder.buy.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         Toast.makeText(a, "Purchased" + " " + flowerlist.get(i).getName(), Toast.LENGTH_LONG).show(); 
        } 
       }); 
      } 
+0

謝謝這對我有用。 :) – Neha

0

試試這個;

public class Viewholder{ 
     TextView srno,name,ltime; 
     Button buy; 
     Model mModel; 


     public void setData(Model item) { 
      mModel = item; 
      name.setText(item.name); 
      updateTimeRemaining(System.currentTimeMillis()); 
     } 

     public void updateTimeRemaining(long currentTime) { 
      timeDiff = mModel.expirationTime - currentTime; // Changes -- remove long 
      if (timeDiff > 0) { 
       int seconds = (int) (timeDiff/1000) % 60; 
       int minutes = (int) ((timeDiff/(1000 * 60)) % 60); 
       int hours = (int) ((timeDiff/(1000 * 60 * 60)) % 24); 
       ltime.setText(hours +":" + minutes +":" + seconds); 

      } else { 

       ltime.setText("Buy Now!!"); 
      } 
     } 
    } 

    @Override 
    public View getView(final int i, View convertView, ViewGroup viewGroup) { 
     Viewholder viewholder = null; 
     if (convertView == null) { 
      viewholder = new Viewholder(); 
      LayoutInflater li=a.getLayoutInflater(); 
      convertView = li.inflate(R.layout.secondcustom, viewGroup, false); 
      viewholder.srno = (TextView) convertView.findViewById(R.id.sr); 
      viewholder.name = (TextView) convertView.findViewById(R.id.flow); 
      viewholder.buy = (Button) convertView.findViewById(R.id.st); 
      viewholder.ltime = (TextView) convertView.findViewById(R.id.lefttime); 
      convertView.setTag(viewholder); 
      synchronized (lstHolders) { 
       lstHolders.add(viewholder); 
      } 
     }else { 
       viewholder = (Viewholder) convertView.getTag(); 
      } 

      viewholder.setData((Model) getItem(i)); 


      final Model model=flowerlist.get(i); 
     viewholder.srno.setText(valueOf(flowerlist.get(i).getSr())); 
     viewholder.name.setText(valueOf(flowerlist.get(i).getName())); 
     viewholder.ltime.setText(valueOf(flowerlist.get(i).getExpirationTime())); 

if(timeDiff!=0) { 
viewholder.buy.setclickable(false); 
viewholder.buy.setEnabled(false); 
}else{ 
viewholder.buy.setclickable(true); 
viewholder.buy.setEnabled(true); 
} 

       viewholder.buy.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         Toast.makeText(a, "Purchased" + " " + flowerlist.get(i).getName(), Toast.LENGTH_LONG).show(); 
        } 
       }); 



     return convertView; 
    } 
+0

它顯示錯誤在setclickable作爲無法解決方法setclickable(布爾)。 – Neha

+0

'setClickable(boolean)'使用這個 –

0

試運行,如果條件點擊收聽碼出方,你只是需要設置按鈕點擊並啓用基於如下的計時器值真/假:

viewholder.buy.setClickable(timeDiff==0); 
viewholder.buy.setEnabled(timeDiff==0); 

viewholder.buy.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     Toast.makeText(a, "Purchased" + " " + flowerlist.get(i).getName(),Toast.LENGTH_LONG).show(); 
    } 
});