1

在我的應用程序T有自定義ListView與2個按鈕。現在我想要的是當用戶點擊ListView中的特定按鈕調用異步任務時,將少量參數發送到服務器。參數來自ArrayList.Now我將如何知道從ListView中點擊了哪個按鈕,並且在該特定位置,應該從ArrayList發送相同的數據。找出哪個按鈕被點擊從自定義列表

CustomAdapter.Java

public class SearchJobsCustomList extends BaseAdapter implements View.OnClickListener { 
    Context c; 
    ArrayList<HashMap<String, String>> data; 

    HashMap<String, String> resultp = new HashMap<String, String>(); 


    public SearchJobsCustomList(Context c, ArrayList<HashMap<String, String>> data) { 
     super(); 
     this.c = c; 
     this.data = data; 


    } 

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

    @Override 
    public Object getItem(int i) { 
     return null; 
    } 

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

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 


     if (view == null) { 
      view = LayoutInflater.from (c).inflate (R.layout.custom_search_jobs_lists, viewGroup, false); 
      resultp = data.get (i); 
      view.setTag (resultp); 
      TextView JobCode = (TextView) view.findViewById (R.id.tv_job_code); 
      TextView Category = (TextView) view.findViewById (R.id.tv_name); 
      TextView ExpYrs = (TextView) view.findViewById (R.id.tv_exp_yrs); 
      TextView ExpMnths = (TextView) view.findViewById (R.id.tv_exp_mnths); 
      TextView Date = (TextView) view.findViewById (R.id.tv_date); 
      Button bestCandidate = (Button) view.findViewById (R.id.bt_best_candidates); 
      Button appliedJobs = (Button) view.findViewById (R.id.bt_applied_jobs); 
      bestCandidate.setOnClickListener (this); 
      appliedJobs.setOnClickListener (this); 

      if (resultp.get ("counts").equals (0)) { 
       bestCandidate.setFocusable (false); 
       bestCandidate.setText (0); 

      } else { 
       bestCandidate.setText (resultp.get ("counts")); 
      } 

      if (resultp.get ("applied").equals (0)) { 
       appliedJobs.setFocusable (false); 
       appliedJobs.setText (0); 

      } else { 
       appliedJobs.setText (resultp.get ("applied")); 
      } 


      JobCode.setText (resultp.get ("code")); 
      Category.setText (resultp.get ("category")); 
      ExpYrs.setText (resultp.get ("minExp")); 
      ExpMnths.setText (resultp.get ("maxExp")); 
      Date.setText (resultp.get ("postedOn")); 


     } 
     return view; 
    } 


    @Override 
    public void onClick(View view) { 

     switch (view.getId()){ 
      case R.id.bt_best_candidates: 
       BestCandidateDisplay display=new BestCandidateDisplay(); 
       display.execute(); 

     } 

    } 


    public class BestCandidateDisplay extends AsyncTask<String,String,String>{ 

     @Override 
     protected String doInBackground(String... strings) { 

      String response= HttpRequest.post ("https://beta135.hamarisuraksha.com/web/WebService/HsJobService.asmx/GetBestCandidates").send ("Vendor_IEntity_Code=" + "&IJob_Req_ID=" + resultp.get ("reqId") + "&IJob_Requestor_ID=" + resultp.get ("iReqId") + "&Mode=" + "TTL").body(); 
      return null; 
     } 
    } 
} 

列表圖像 enter image description here

回答

0
Try this way,hope this will help you to solve your problem. 

public class SearchJobsCustomList extends BaseAdapter{ 
     Context context; 
     ArrayList<HashMap<String, String>> data; 

     public SearchJobsCustomList(Context context, ArrayList<HashMap<String, String>> data) { 
      super(); 
      this.context = context; 
      this.data = data; 
     } 

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

     @Override 
     public Object getItem(int i) { 
      return null; 
     } 

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

     @Override 
     public View getView(final int i, View view, ViewGroup viewGroup) { 

      ViewHolder holder; 
      if (view == null) { 
       holder = new ViewHolder(); 
       view = LayoutInflater.from(context).inflate(R.layout.custom_search_jobs_lists, null, false); 
       holder.JobCode = (TextView) view.findViewById(R.id.tv_job_code); 
       holder.Category = (TextView) view.findViewById(R.id.tv_name); 
       holder.ExpYrs = (TextView) view.findViewById(R.id.tv_exp_yrs); 
       holder.ExpMnths = (TextView) view.findViewById(R.id.tv_exp_mnths); 
       holder.Date = (TextView) view.findViewById(R.id.tv_date); 
       holder.bestCandidate = (Button) view.findViewById(R.id.bt_best_candidates); 
       holder.appliedJobs = (Button) view.findViewById(R.id.bt_applied_jobs); 
       view.setTag(holder); 
      }else{ 
       holder = (ViewHolder) view.getTag(); 
      } 


      if (data.get(i).get("counts").equals("0")) { 
       holder.bestCandidate.setFocusable (false); 
       holder.bestCandidate.setText (0); 

      } else { 
       holder.bestCandidate.setText (data.get(i).get("counts")); 
      } 

      if (data.get(i).get("applied").equals("0")) { 
       holder.appliedJobs.setFocusable (false); 
       holder.appliedJobs.setText (0); 

      } else { 
       holder.appliedJobs.setText (data.get(i).get ("applied")); 
      } 


      holder.JobCode.setText (data.get(i).get("code")); 
      holder.Category.setText (data.get(i).get("category")); 
      holder.ExpYrs.setText (data.get(i).get("minExp")); 
      holder.ExpMnths.setText (data.get(i).get("maxExp")); 
      holder.Date.setText (data.get(i).get("postedOn")); 

      holder.appliedJobs.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        HashMap<String,String> row = data.get(i); 
        BestCandidateDisplay display=new BestCandidateDisplay(); 
        display.execute(row.get("reqId"), row.get("reqId")); 
       } 
      }); 

      holder.appliedJobs.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        HashMap<String,String> row = data.get(i); 
        BestCandidateDisplay display=new BestCandidateDisplay(); 
        display.execute(row.get("reqId"),row.get("reqId")); 
       } 
      }); 

      return view; 
     } 

     class ViewHolder { 
      TextView Category; 
      TextView ExpYrs; 
      TextView ExpMnths; 
      TextView Date; 
      TextView JobCode; 
      Button bestCandidate; 
      Button appliedJobs; 
     } 
    } 

    public class BestCandidateDisplay extends AsyncTask<String,String,String> { 

     @Override 
     protected String doInBackground(String... strings) { 

      String response= HttpRequest.post("https://beta135.hamarisuraksha.com/web/WebService/HsJobService.asmx/GetBestCandidates").send ("Vendor_IEntity_Code=" + "&IJob_Req_ID=" +strings[0]+ "&IJob_Requestor_ID=" +strings[1]+ "&Mode=" + "TTL").body(); 
      return null; 
     } 
    } 
+0

tysm它工作:) – Anuj

+0

很高興幫助你。 –

1

你獲得通過在onClick()的觀點是你正在尋找的按鈕。

public void onClick(View v) { 
    // 1) Possibly check for instance of first 
    Button b = (Button)v; 
    String buttonText = b.getText().toString(); 
} 
+0

哪個視圖?我dint得到你 – Anuj

+0

在這條線'公共無效onClick(查看視圖){' –

+0

好吧,我應該如何發送參數因爲我會找到位置,用戶選擇並將該位置給arrayLIst – Anuj

0
onClick(View v){ 

     int id=v.getId(); 

     if(id==R.id.matching_jobs){ 
      ............write your code......... 
     } 
     else if(id== R.id.applied_jobs){ 
      ...............write your code.......... 
     } 

    } 

這可能會幫助你...

+0

不,這個將無法工作。多個按鈕共享相同的ID。 – Marius

+0

否則,你可以在getview本身寫onclicklistenter .. – Sathish

+0

這不利於可讀性。 '如果否則如果其他如果...'爲'int'也不是那麼好。 – Marius

1

剛剛設置的標籤,像這樣的按鈕。

bestCandidate.setTag(10*i+1); 
appliedJobs.setTag(10*i+2); 

和的onClick方法在列表中的項目的位置可以通過相反的過程可以這樣來計算

int tag = (Integer) view.getTag(); 
int pos = (tag - 1)/10; 
// or 
int pos = (tag - 2)/10; 

或試試這個

bestCandidate.setTag(10*i); 
    appliedJobs.setTag(10*i); 

bestCandidate.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Integer pos = (Integer) v.getTag(); 

      } 
     }); 
     appliedJobs.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Integer pos = (Integer) v.getTag(); 


      } 
     }); 
+0

謝謝bt sir plz你能更詳細地解釋我如何工作? – Anuj

+0

當你在listView中創建一個單元格時,你會知道單元格的位置,因此你可以用它的位置設置按鈕的標籤。看到我編輯的anwser – Asheesh

3

getView它的自我,你可以使用onclick

- 第一組標籤後Button初始化的。然後設置文本使用這樣

appliedJobs.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       // your code here 
      } 
     }); 
3

你可以做類似下面,你ButtongetView()

bestCandidate.setTag(i); 

onClick方法,你可以在下面做Button標籤這是列表行的位置,

@Override 
    public void onClick(View view) { 

     switch (view.getId()){ 
      case R.id.bt_best_candidates: 

      Toast.makeText(getActivity(), view.getTag()+" is clicked", Toast.LENGTH_SHORT).show(); 
      BestCandidateDisplay display=new BestCandidateDisplay(); 
      display.execute(); 

     } 

    } 
+0

謝謝它爲我工作:) – Anandhu

0

在您的自定義適配器getView()方法,你可以觸發事件onClick爲您的兩個按鈕。

appliedJobs.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      // your code here 
     } 
    }); 

MatchingJobs.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      // your code here 
     } 
    }); 
0

而是覆蓋您的自定義適配器的onClick方法,並從那裏執行你的AsyncTask的,附加一個OnClickListener,而你的getView()方法中定義的按鈕。例如,當你getView()方法中定義你Buttons

public View getView(int i, View view, ViewGroup viewGroup) { 


    if (view == null) 
    { 
     view = LayoutInflater.from (c).inflate (R.layout.custom_search_jobs_lists, viewGroup, false); 
    } 

    Button bestCandidate = (Button) view.findViewById (R.id.bt_best_candidates); 
    bestCandidate.setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View v) { 

       // Start your AsyncTask here. 

      } 
    }); 

    Button appliedJobs = (Button) view.findViewById (R.id.bt_applied_jobs); 
    appliedJobs.setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View v) { 

       // Start your AsyncTask here. 

      } 
    }); 

........ 
} // end of getView() 

這種方法的優點是,它可以確保您不必擔心找不到包含已單擊該按鈕列表項元素的位置在執行期間,因爲它們綁定到您的getView()方法中由您的LayoutInflater充氣的視圖(列表項)。您的列表很可能會超出屏幕大小,導致您的ListView回收其元素,也就是說,如果您想要在按鈕單擊時更改列表項目的背景色,意外的結果。在getView()方法中實現OnClickListeners也可以幫助您管理這種情況,方法是通過操作getView()方法本身內的列表項位置,因爲它可以作爲方法的參數使用。

相關問題