Friday, March 23, 2012

Enable Button Inside A List Item

Probably most of us needed this kind of rich ListView items that contains several views including buttons. For example when you're building an iOS like ListView that have "Delete" buttons in every list item.

Having a button means that you need to listen the click events on that button. But, if the button is inside a list item, you can not simply sense the clicks to the button, because ListView's OnItemClickListener overwhelms all the click events on that item. In order to avoid this and make your button clickable you need to do the following changes...

At first you need to set android:focusable and android:focusableInTouchMode attributes of your button inside the list item to "false".

<Button
 .....
 android:focusable="false"
 android:focusableInTouchMode="false"
 .....
 >
</Button>

The next thing you need to do is setting an OnClickListener to your button inside your list adapter class. You can achieve this by adding a parameter to your adapter's constructor and/or adding a setter method to the adapter that sets the button's OnClickListener.

In my example I put an OnClickListener instance as a field in my adapter and I set it in my constructor and also added a setter for the field.



public class MyAdapter extends BaseAdapter {
 .....
 public OnClickListener listener;

 .....
 public MyAdapter (Context context, OnClickListener listener) {
  this.context = context;
  mInflater = LayoutInflater.from(this.context);
  this.listener = listener;
 }

 public void setButtonListener(OnClickListener listener) {
  this.listener = listener;
 }

 .....

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  
  if (convertView == null) {
   convertView = 
    mInflater.inflate(R.layout.my_list_row, null);

   holder = new ViewHolder();
   ...
   holder._button = 
    (Button) convertView
     .findViewById(R.id.listRowButton);
   ...
   convertView.setTag(holder);

  } else {
   holder = (ViewHolder) convertView.getTag();
  }

  .....

  if (this.listener != null) {
   holder._button.setOnClickListener(this.listener);
  }
  .....
 }
}


And lastly you need to set an OnClickListener to your adapter instance where you set your ListView's adapter inside your Activity. And this is the tricky part that you need to sense which list item's button has received a click event by by using a for loop. (It doesn't look so efficient, but this was the easiest way to achieve my goal, so I did it like this. If you have any other efficient solutions please provide a comment.)


ListView myList = (ListView) findViewById(R.id.myList);

// Firstly I set the OnClickListener as null.
MyAdapter adapter = new MyAdapter(this, null);

.....
// Here is where I set the listener for button inside list item.
myAdapter.setButtonListener(new OnClickListener() {

 @Override
 public void onClick(View v) {
  for (int i = 0; i < _listView.getChildCount(); i++) {
   if (v == _listView
    .getChildAt(i).findViewById(R.id.listRowButton))
   {

    // Do Something on Button Click

   }
  }
 }
}});
.....

myList.setAdapter(myAdapter);


That's it! You can do whatever with your list item's button now. You can also use the same procedure with CheckBoxes, RadioButtons or any other Views.

Enjoy!

13 comments:

  1. This is because the 20lbs isn’t really “Halotest” it is in fact cellular water (which is different from estrogen water retention).

    ReplyDelete
    Replies
    1. Great Article android based projects

      Java Training in Chennai Project Center in Chennai Java Training in Chennai projects for cse The Angular Training covers a wide range of topics including Components, Angular Directives, Angular Services, Pipes, security fundamentals, Routing, and Angular programmability. The new Angular TRaining will lay the foundation you need to specialise in Single Page Application developer. Angular Training Project Centers in Chennai

      Delete
  2. Would you like to earn money from online casinos at BGAOC? best gambling casino Come to us and try.

    ReplyDelete
  3. Качественная лед лента разных цветов, герметичные и нет, я обычно беру в Экодио

    ReplyDelete
  4. Enroll today to get free access to our live demo session which is a great opportunity to interact with the trainer directly which is a placement based Salesforce training India with job placement and certification . Get salesforce training in affordable cost from a best computer institute.

    ReplyDelete
  5. MAJOR168 is open for football betting today. There are many big camps together BTi SBOBET IBCBET CMD365 if you are looking for a football betting website. Do not miss this site, there is football, there are all sports in the world. คาสิโนออนไลน์. Betting is available 24 hours a day with the best odds per pair in Thailand. Guaranteed automatic deposit and withdrawal system 10 seconds.

    Live sports betting Online football betting Good price with every football match open for today online football betting SAGAME88 There are many big camps together, SBOBET IBCBET BTi CMD365, the only website complete in online football betting คาสิโนออนไลน์. There is every sport on the planet in here. With the automatic deposit and withdrawal system for 10 seconds, we have a live football system to watch every night.


    We offer a wide variety of services. Called him the only player to finish with everything else does not have to go to the web preview ufabet as online. Online casinos Baccarat online Online betting games, Slot online, and with new technology, you can play ufabet via mobile phone today. Mobile Baccarat, play online via the website


    Ufabet1688 of us again the way we are websites directly, not through a General Services, where customers will know it absolutely was extremely really no cheating possible on-site gambling online, it is ufabet1688 of us will hit prices.

    ReplyDelete
  6. Along with it also has a live casino 24 hours a day. สมัคร ufa Bet online gambling website is available to play with all casinos, baccarat, slots, roulette, dice and many other card games. We have gathered it here. With many promotions Apply for UEFA Bet now, we are happy to serve you all. With a professional team ready to solve problems And serve all of you There is a team to support the service. And answer your questions 24 hours a day.

    ReplyDelete
  7. สล็อตออนไลน์ (Slot Online) คือการนำเครื่องเล่นพนัน ตู้สล็อตแมชชีน ที่กล่าวมาข้างต้นนี้ นำมาทำเป็นเกมอิเล็กทรอนิกส์ที่เรียกกันว่า สล็อตออนไลน์ เนื่องด้วยยุคสมัยพัฒนาคนหันมานิยมเล่นพนันกันผ่านคอมพิวเตอร์ จะได้นำเกมสล็อตมาทำเป็นเกมพนันออนไลน์ ผ่านระบบเครื่อข่ายอินเตอร์เน็ต ซึ่งผู้เล่นสามารถเล่นแบบผ่าน โปรแกรมสล็อต ก็ได้หรือจะเป็นการเข้าเล่น Slots ผ่านหน้าเว็บไซต์ผู้ให้บริการ ซึ่งบริการเกม สล็อตออนไลน์ นั้นก็มีรูปแบบของกติกาการเล่น คล้ายกันกับการเล่นบนตู้สล็อตแมชชีน ทั้งภาพและเสียงสมจริงเร้าใจไม่แพ้กันกับไปนั่งเล่นในคาสิโนเลยทีเดียว.

    ReplyDelete
  8. If you are looking for a good website, ufa, UEFA BET casino site. Which can be played as a complete solution, able to answer Both in terms of quality and performance that are quite diverse It is best to have a lot of these things.

    ReplyDelete
  9. ufabet Parent company, the most popular online gambling website, whether it is online football betting Online casinos Baccarat online All of them were not less popular than each other. Become a member of UEFA Bet Playing with the parent company Did not pass agent Bet on a variety of casino games Especially the gambler who likes to Online football betting Our website provides 4 football odds, football betting, a minimum of 10 baht , betting is easy

    ReplyDelete
  10. แทงบอล กับ i99CLUB เว็บแทงบอล ที่ตอบโจทย์ให้กับคุณได้อย่างดีเยี่ยมที่สุด เท่าที่จะเป็นไปได้แล้วก็บอกได้เลยว่าการทำเงินตรงจุดนี้ เป็นอีกหนึ่งทางเลือกที่ข้างๆ ที่จะการันตีได้อย่างชัดเจนแล้วว่า เป็นสิ่งที่ดีที่สุดและทรงประสิทธิภาพมากที่สุด เท่าที่จะเป็นไปได้และเชื่อได้เลยว่า มันจะเป็นอีกหนึ่งตัวเลือกที่พร้อมจะเปิดกว้างให้กับคุณได้ อย่างมั่นคงและทรงประสิทธิภาพมากที่สุด

    ReplyDelete
  11. เราให้บริการรวดเร็ว ถูกต้อง แม่นยำ และปลอดภัยต่อข้อมูล ใช้งานง่าย สะดวก โดยที่ไม่ทำให้การเดิมพันของท่านติดขัด ใช้เวลาเพียงไม่กี่วินาทีเท่านั้น และสามารถเข้าเล่นได้จริง ระบบของเราเป็น คาสิโนสด แทงบอลสด ที่มีการถ่ายทอดสดตรงจากคาสิโนในต่างประเทศ ไม่มีการตัดต่อวีดีโอ ทำให้ท่านสามารถมั่นใจได้ว่าจะไม่มีการโกงหรือการทุจริตเกิดขึ้น.

    ReplyDelete
  12. บาคาร่าออนไลน์ ถือว่าเป็น เว็บบาคาร่าออนไลน์ ที่นอกจากทำการรวบรวมเหล่า เกมคาสิโนออนไลน์ที่ดีที่สุด 2021 ทุกรูปแบบที่มีแล้วนั้น ทางเว็บเรา ยังพร้อมมอบสิทธิพิเศษ และผลประโยชน์ต่าง ๆ มากมาย เพื่อคืนกำไร และเอื้อสิทธิผลประโยชน์ที่ผู้เล่นควรได้รับ ไม่ว่าจะเป็นสมาชิกเก่าหรือใหม่ก็ตาม อาทิเช่น โปรโมชั่นแรกเข้า 30% ทันที โปรโมชั่นแนะนำเพื่อนรับ 20% และ โปรโมชั่นคืนยอดเสียที่ผู้เล่นสามารถกดรับได้ในทุก ๆ เดือน 5 % อีกทั้งทางเว็บไซต์ยังได้พัฒนาระบบทางการเงิน เข้าสู่รูปแบบออโต้ หรืออัตโนมัติ เพื่อความปลอดภัยและมั่นคงในธุรกรรมทางการเงินของเหล่าสมาชิก รวมไปถึงการให้บริการติดต่อสอบถามตลอด 24 ชม. กับทีมงานเจ้าหน้าที่มืออาชีพ บาทคาร่าออนไลน์ ที่พร้อมให้คำปรึกษาด้วยเช่นกันนั่นเอง.

    ReplyDelete