如何在baseAdapter中使用onclick按钮

Rao*_*o's 7 android onclick android-emulator android-intent android-layout

如何使用扩展baseadapter中的click事件按钮..我尝试了很多但没有用..在我的项目中有自定义列表视图,它包含文本,按钮(btnlist),快速滚动索引.当我onclick按钮(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());
        }

    });
}


     }
Run Code Online (Sandbox Code Playgroud)

.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" />
Run Code Online (Sandbox Code Playgroud)

默认列表视图

       <ListView 

         android:id="@+id/homelistView"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:dividerHeight="0dip" />
Run Code Online (Sandbox Code Playgroud)

Lef*_*ris 6

您应该使用适配器使用项目填充列表.然后在您的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 (i.e. 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);
}
Run Code Online (Sandbox Code Playgroud)

然后在你的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

    }   
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息ListFragment请参见此处.

我认为这是一个非常好的例子(虽然通过扩展ArrayAdapter而不是BaseAdapter这个stackoverflow答案中.

有一点需要记住:

  1. 该按钮不能是可聚焦的(即在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
}
Run Code Online (Sandbox Code Playgroud)

最后,请注意一点.此解决方案意味着您单击列表行并触发事件.

我认为,如果您希望用户单击按钮并触发按钮上的事件,则需要listview.setItemsCanFocus(true)在扩充ListView XML之后立即设置调用,并确保Button focusable位于XML中.听取这个onClick事件应该有用.

这在ListView中呈现的GoogleIO世界的滑动器25描述(你可以得到它在这里视频是在这里)

希望这可以帮助