7

Wie man auf click event button in extend baseadapter verwendet .. Ich habe viel versucht, aber keine Verwendung .. In meinem Projekt gibt es benutzerdefinierte listview, es enthält Text, button (btnlist), fastscroll index . wenn ich onclick button (btnlist) es ist nicht gng zu anderen aktivitäten, kein fehler wird auch angezeigt, kein toast ..
Plz helfe mir mit beispiel. Vielen Dank im Voraus.Wie man onclick button in baseAdapter verwendet

Schnell ref: 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" /> 

Standard-Listenansicht

 <ListView 

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

wird Ihre Schaltfläche ausgewählt, wenn Sie darauf drücken? – Carnal

+0

@carnel kein Chef onclick Ereignis funktioniert nicht .. –

+0

Ich weiß, dass auf Click-Ereignis nicht ausgelöst wird, aber wenn die Schaltfläche überhaupt nicht ausgewählt wird, versuchen Sie es als fokussierbar in Ihrer XML-Datei festlegen. – Carnal

Antwort

6

Sie sollten Ihren Adapter verwenden, um die Liste mit den Elementen zu füllen. Dann sollten Sie in Ihrer Aktivität oder Ihrem Fragment das Ereignis onListItemClick implementieren, um den Klick auf das Listenelement zu verarbeiten.

EDIT: Ich veröffentliche ein Beispiel unten, wo ich eine ListFragment bin mit - das ist das Stück Code ich jetzt zur Verfügung haben, ich etwas Bestimmtes zu ListView später veröffentlichen können:

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); 
} 

Dann in Ihrem 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 

    } 
} 

Einzelheiten zu ListFragment siehe here.

denke ich, dass ein sehr schönes Beispiel (obwohl durch ArrayAdapter statt BaseAdapter sich in this stackoverflow answer hown ist

Es ist ein Punkt zu erinnern.

  1. Die Taste muss nicht fokussierbar sein (dh in . XML Verwendung android:focusable="false" - wie Sie in Ihrem XML haben)
  2. Sie erfassen müssen, um ein onItemClick Ereignis behandelt, wie unten dargestellt (Auszug aus dem Link oben):

Code:

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 
} 

Schließlich ist zu beachten einen Punkt. Diese Lösung bedeutet, dass Sie auf die Listenzeile klicken und das Ereignis ausgelöst wird.

Ich denke, dass, wenn der Benutzer möchte auf die Schaltfläche und das Ereignis klicken Sie auf die Schaltfläche, um gefeuert, dann müssen Sie rufen gesetzt listview.setItemsCanFocus(true) rechts, nachdem Sie Ihre Listview XML aufblasen und stellen Sie sicher, dass der Knopf ist focusable in das XML. Hören für das onClick Ereignis sollte dann funktionieren.

Das in Folie 25 der GoogleIO World of Listview-Präsentation beschrieben wird (man kann es here bekommen und die video is here)

this helps

+0

sicher .. PLZ Update ... dnt vergessen..ich werde versuchen, diesen Code hinzuzufügen .. danke für deine Antwort. –

+1

BTW, wenn Sie 'android: focusable =" false "' für die Schaltfläche setzen (wie Sie haben), sollte das Berühren des Listenelements das 'onListItemClick'-Ereignis auslösen. Dies sollte in Ordnung sein, es sei denn, Sie haben mehr als eine Schaltfläche in der Listenzeile. – Lefteris

+0

** update (Korrigiert das Ereignis) ** Beachten Sie, dass das 'onItemSelected' auf der ListView ist (nicht auf der Schaltfläche) und es wird in die Callback die Position geklickt enthalten. Verwenden Sie dann "getItemAtPosition", um auf das spezifische Element zuzugreifen. – Lefteris

2

Einsatz t Der folgende Code in getView() Methode:

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 
      } 
     }); 
+0

keine Notwendigkeit von holder.button –

3

die folgenden für den Button versuchen:

android:focusable="false" 
2

Schreiben Sie die holder.btnList.setOnClickListener in den if (rowView == null) Zustand und versuchen Sie es erneut.

+0

versucht, dass die Dinge .. aber keine Verwendung .. –

Verwandte Themen