7

Come utilizzare il pulsante evento click in estensione baseadapter .. Ho provato molto ma non uso .. Nel mio progetto c'è list list personalizzato, contiene testo, pulsante (btnlist), indice fastscroll . quando clicco sul pulsante (btnlist) non gira ad altre attività, non viene visualizzato nessun errore, nessun toast ..
Plz aiutami con l'esempio. grazie in anticipoCome utilizzare il pulsante onclick in baseAdattatore

rapida 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" /> 

predefinita ListView

 <ListView 

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

viene selezionato il pulsante quando viene premuto? – Carnal

+0

@carnel nessun evento boss onclick non funziona. –

+0

So che l'evento click non viene attivato, ma se il pulsante non viene selezionato, prova a impostarlo come focheggiabile nel file xml. – Carnal

risposta

6

È necessario utilizzare l'adattatore per compilare l'elenco con gli elementi. Quindi nella tua attività o frammento dovresti implementare l'evento onListItemClick per gestire il clic sulla voce dell'elenco.

EDIT: Vi metto un esempio sotto dove sto usando un ListFragment - questo è il pezzo di codice che ho a disposizione in questo momento, posso pubblicare qualcosa di specifico per ListView tardi:

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

Poi, nel tuo 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 

    } 
} 

Per i dettagli sulla ListFragment vedere here.

penso che un esempio molto bello (anche se estendendo ArrayAdapter invece di BaseAdapter è hown in this stackoverflow answer

c'è un punto da ricordare:.

  1. Il pulsante non deve essere attivabile (cioè in Uso XML android:focusable="false" - come nel codice XML.
  2. È necessario acquisire fornire un evento onItemClick gestito come illustrato di seguito (estratto dal collegamento sopra):

Codice:

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 
} 

Infine, si noti un punto. Questa soluzione significa che fai clic sulla riga dell'elenco e l'evento viene generato.

Penso che se si desidera che l'utente clicca sul pulsante e l'evento per essere licenziato sul pulsante, quindi è necessario impostare chiamare listview.setItemsCanFocus(true) subito dopo si gonfia il tuo XML ListView e assicurarsi che il pulsante è focusable in l'XML. L'ascolto dell'evento onClick dovrebbe quindi funzionare.

Questo è descritto nella presentazione 25 della GoogleIO mondiale di presentazione ListView (si può ottenere here e la video is here) Speranza

questo aiuta

+0

sicuro .. plz update ... dnt forget..i proverò ad aggiungere questo codice .. grazie per la tua risposta –

+1

btw, se imposti 'android: focusable =" false "' per il pulsante (come hai), quindi toccando l'elemento della lista dovresti attivare l'evento 'onListItemClick'. Questo dovrebbe andare bene a meno che tu non abbia più di un pulsante nella riga elenco. – Lefteris

+0

** aggiornamento (corretto l'evento) ** Si noti che 'onItemSelected' si trova su ListView (non sul pulsante) e includerà nella callback la posizione cliccata. Quindi usa 'getItemAtPosition' per accedere all'elemento specifico. – Lefteris

2

uso t ha seguito il codice in getView() Metodo:

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

non c'è bisogno di holder.button –

3

provare quanto segue per il pulsante:

android:focusable="false" 
2

Scrivi lo holder.btnList.setOnClickListener all'interno della condizione if (rowView == null) e riprova.

+0

provato quelle cose .. ma non serve .. –