7

Jak używać przycisku zdarzenia click w rozszerzeniu baseadapter .. Próbowałem dużo ale nie używam .. W moim projekcie jest niestandardowy widok listy, zawiera on tekst, przycisk (btnlist), indeks szybkiego przewijania . kiedy przycisk onclick (btnlist) nie jest powiązany z inną aktywnością, nie wyświetla się również żaden błąd, nie ma toastu.
Plz pomóż mi z przykładem. dziękuję z góry.Sposób użycia przycisku onclick w baseAdapter

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

domyślny ListView

 <ListView 

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

czy przycisk zostaje wybrany po naciśnięciu? – Carnal

+0

Zdarzenie @carnel no boss onclick nie działa. –

+0

Wiem, że zdarzenie click nie jest uruchamiane, ale jeśli przycisk nie zostanie w ogóle wybrany, spróbuj ustawić go jako możliwy do ustawienia w pliku xml. – Carnal

Odpowiedz

6

Powinieneś użyć swojego adaptera do zapełnienia listy przedmiotami. Następnie w Aktywności lub Fragmencie należy zaimplementować zdarzenie onListItemClick, aby obsłużyć kliknięcie elementu listy.

EDIT: jestem delegowania przykład poniżej gdzie używam ListFragment - jest to kawałek kodu mam dostępne w tej chwili, mogę pisać coś konkretnego do ListView później:

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

Następnie w 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 

    } 
} 

szczegółowe informacje na temat ListFragment zobaczyć here.

myślę, że bardzo ładny przykład (chociaż przez rozszerzenie ArrayAdapter zamiast BaseAdapter jest hown w this stackoverflow answer

Jest jeden punkt do zapamiętania.

  1. Przycisk nie musi być aktywowana (czyli w XML use android:focusable="false" - tak jak w swoim XML)
  2. Musisz przechwycić dostarczyć zdarzenie onItemClick obsługiwane w sposób przedstawiony poniżej (wyciąg z powyższego linku):

Kod:

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 
} 

Wreszcie należy pamiętać, jeden punkt. To rozwiązanie oznacza, że ​​klikniesz wiersz listy, a wydarzenie zostanie wyrzucone.

Myślę, że jeśli chcesz, aby użytkownik kliknął przycisk i wydarzenie, aby zostać wystrzelonym na przycisku, musisz ustawić wywołanie listview.setItemsCanFocus(true) zaraz po nadmuchaniu pliku ListView XML i upewnić się, że przycisk jest focusable w XML. Wówczas powinno działać odsłuchanie zdarzenia onClick.

Jest to opisane w prowadnicy 25 GoogleIO World of prezentacji ListView (można je dostać here i video is here)

Nadzieja to pomaga

+0

pewnie .. aktualizacja plz ... nie zapomnij..i spróbuje dodać ten kod .. dzięki za odpowiedź. –

+1

btw, jeśli ustawisz 'android: focusable =" false "' dla przycisku (tak jak masz), to dotknięcie elementu listy powinno uruchomić zdarzenie 'onListItemClick'. To powinno być w porządku, chyba że masz więcej niż jeden przycisk w wierszu listy. – Lefteris

+0

** update (Poprawiono zdarzenie) ** Zwróć uwagę, że 'onItemSelected' jest na liście ListView (nie na przycisku) i będzie zawierał w wywołaniu zwrotnym klikniętą pozycję. Następnie użyj 'getItemAtPosition', aby uzyskać dostęp do określonego elementu. – Lefteris

2

wykorzystanie t następujący kod w getView() Metoda:

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

nie trzeba właściciela.button –

3

spróbuj wykonać następujące czynności dla przycisku:

android:focusable="false" 
2

Wpisz holder.btnList.setOnClickListener w stanie if (rowView == null) i spróbuj ponownie.

+0

próbowałem tego, ale nie używam .. –

Powiązane problemy