如何使用baseAdapter中的onclickbutton

如何使用扩展baseadapter点击事件button..我尝试了很多,但没有用..在我的项目中有自定义列表视图,它包含文本,button(btnlist),fastscroll索引。 当我点击button(btnlist)它不是其他活动gng,没有错误也显示,不吐司..
Plz帮助我的例子。 谢谢你。

快速参考:getview —> holder.btnList.setOnClickListener

EfficientAdapter.java

public class EfficientAdapter extends BaseAdapter implements SectionIndexer, OnClickListener { IndexableListView mListView; private String mSections = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ArrayList<Patient> patientListArray; private Intent intent; private Patient patient; private LayoutInflater mInflater; private Context context; private int positions; ViewHolder holder; public EfficientAdapter(Context context) { mInflater = LayoutInflater.from(context); this.context = context; String patientListJson = CountriesList.jsonData; JSONObject jssson; try { jssson = new JSONObject(patientListJson); patientListJson = jssson.getString("PostPatientDetailResult"); } catch (JSONException e) { e.printStackTrace(); } Gson gson = new Gson(); JsonParser parser = new JsonParser(); JsonArray Jarray = parser.parse(patientListJson).getAsJsonArray(); patientListArray = new ArrayList<Patient>(); for (JsonElement obj : Jarray) { Patient patientList = gson.fromJson(obj, Patient.class); patientListArray.add(patientList); // Log.i("patientList", patientListJson); } } public int getCount() { return patientListArray.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(final int position, View convertView, ViewGroup parent) { this.positions = position; View rowView = convertView; if (rowView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); rowView = inflater.inflate(R.layout.homemplebrowview, parent, false); holder = new ViewHolder(); holder.text1 = (TextView) rowView.findViewById(R.id.name); holder.text2 = (TextView) rowView.findViewById(R.id.mrn); holder.text3 = (TextView) rowView.findViewById(R.id.date); holder.text4 = (TextView) rowView.findViewById(R.id.age); holder.text5 = (TextView) rowView.findViewById(R.id.gender); holder.text6 = (TextView) rowView.findViewById(R.id.wardno); holder.text7 = (TextView) rowView.findViewById(R.id.roomno); holder.text8 = (TextView) rowView.findViewById(R.id.bedno); holder.btnList = (Button) rowView.findViewById(R.id.listbutton); /*Button editButton = (Button) rowView.findViewById(R.id.listbutton) ; editButton.setTag(position); editButton.setClickable(true); editButton.setOnClickListener(EfficientAdapter.this); rowView.setClickable(true);*/ rowView.setTag(holder); } else { holder = (ViewHolder) rowView.getTag(); } holder.text1.setText(Util.formatN2H(patientListArray.get(position) .getName())); holder.text2.setText(patientListArray.get(position).getMrnNumber()); holder.text3.setText(Util.formatN2H(patientListArray.get(position) .getRoom())); holder.text4.setText(Util.formatN2H(patientListArray.get(position) .getAge())); holder.text5.setText(Util.formatN2H(patientListArray.get(position) .getGender())); holder.text6.setText(Util.formatN2H(patientListArray.get(position) .getWard())); holder.text7.setText(Util.formatN2H(patientListArray.get(position) .getRoom())); holder.text8.setText(Util.formatN2H(patientListArray.get(position) .getBed())); holder.btnList.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast.makeText(context, "STAT", Toast.LENGTH_SHORT).show(); Intent next = new Intent(context, SeviceDetails.class); Log.i("patient", " next "+ position + " onclickposition " + patientListArray.get(position).getMrnNumber()); patient = getPatientDetailsByMrn(patientListArray, position); Log.i("DDDD ", patient.getMrnNumber()); next.putExtra("patient", patient); next.putExtra("position", position); System.out.println("patient"+ patient); context.startActivity(next); } }); return rowView; } static class ViewHolder { public Button btnList; public TextView text8; public TextView text7; public TextView text6; public TextView text5; public TextView text4; public TextView text1; public TextView text2; public TextView text3; } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); } public int getPositionForSection(int section) { sortMyData(); Log.i("getPositionForSection", "section" + section); // If there is no item for current section, previous section will be // selected for (int i = section; i >= 0; i--) { for (int j = 0; j < getCount(); j++) { if (i == 0) { Log.i("getPositionForSection- i", "section" + i); // For numeric section for (int k = 0; k <= 9; k++) { if (StringMatcher.match( String.valueOf(patientListArray.get(j) .getName().charAt(0)), String.valueOf(k))) Log.i("getPositionForSection- j", "section" + j); return j; } } else { if (StringMatcher.match( String.valueOf(patientListArray.get(j).getName() .charAt(0)), String.valueOf(mSections.charAt(i)))) return j; } } } return 0; } public int getSectionForPosition(int position) { return 0; } public Object[] getSections() { String[] sections = new String[mSections.length()]; for (int i = 0; i < mSections.length(); i++) sections[i] = String.valueOf(mSections.charAt(i)); return sections; } /** * sorting the patientListArray data */ public void sortMyData() { // sorting the patientListArray data Collections.sort(patientListArray, new Comparator<Object>() { @Override public int compare(Object k1, Object k2) { Patient p1 = (Patient) k1; Patient p2 = (Patient) k2; return p1.getName().compareToIgnoreCase(p2.getName()); } }); } } 

.XML

  <Button android:id="@+id/listbutton" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignTop="@+id/name" android:layout_marginRight="43dp" android:focusable="false" android:text="Episode" android:textColor="#666666" /> 

默认的listview

  <ListView android:id="@+id/homelistView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:dividerHeight="0dip" /> 

Solutions Collecting From Web of "如何使用baseAdapter中的onclickbutton"

您应该使用适配器来填充项目列表。 然后在你的Activity或Fragment中,你应该实现onListItemClick事件来处理点击列表项。

编辑:我发布一个例子下面,我使用一个ListFragment – 这是我现在可用的代码段,我可以后来发布特定的ListView

 public class RecipiesActivity extends FragmentActivity { private RecipiesSummaryListAdapter m_listAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* here you need to set the adapter of the listview and do other things for your applicaiton (ie populate the data in your adapter. In your case, since you are calling a WS you want to do that in a different task */ ListFragment lf = (ListFragment) fm.findFragmentById(R.id.my_list_fragment); lf.setListAdapter(m_listAdapter); } 

然后在你的ListFragment

 /* imports and other things go here then... */ public class MyListFragment extends ListFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return (View) inflater.inflate(R.layout.myListViewXml, container, false); } @Override public void onListItemClick(ListView l, View v, int position, long id) { // put your handler here } } 

有关ListFragment详细信息,请参阅此处 。

我认为这是一个很好的例子(尽pipe通过扩展ArrayAdapter而不是BaseAdapter已经在这个stackoverflow的答案 。

有一点要记住:

  1. 该button不能是可调焦的(即在XML中使用android:focusable="false" – 就像你在XML中一样)。
  2. 您需要捕获提供的onItemClick事件处理,如下所示(摘自上面的链接):

码:

 listview.setOnItemClickListener(new OnItemClickListener() { //@Override public void onItemClick(AdapterView arg0, View view, int position, long id) { // user clicked a list item, make it "selected" selectedAdapter.setSelectedPosition(position); //Do your stuff here } 

最后请注意一点。 这个解决scheme意味着你点击列表行,事件被触发。

我认为,如果你想要用户点击button和事件触发button,那么你需要设置调用listview.setItemsCanFocus(true)后,你膨胀你的ListView XML,并确保button是可以focusable在XML中。 然后听取onClick事件。

这在GoogleIO的ListView演示文稿幻灯片25中进行了描述(您可以在此处获取, video在此处 )

希望这可以帮助

尝试以下button:

 android:focusable="false" 

在getView()方法中使用下面的代码:

  Button status = (Button) rowView.findViewById(R.id.image1); status.setBackgroundResource(R.drawable.add_account); status.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // DO your stuff } }); 

if (rowView == null)条件内写入holder.btnList.setOnClickListener ,然后重试。