2016-04-08 7 views
3

So mache ich eine App, wo eine der Funktionen Sie sind in der Lage, Warnungen einzustellen. Im Folgenden finden Sie 2 Beispielbenachrichtigungen, bei denen ich einen Adapter zum Einfügen in eine ListView verwendet habe. Jedes Element verfügt über eine ImageView, eine TextView und eine andere ImageView.So fügen Sie einen onClickListener zu verschiedenen Elementen in einer ListView-Zeile hinzu

enter image description here

Meine Frage ist, wie würde ich auf einem onClickListener für die verschiedene Bilder drehen und vielleicht sogar der Text je nachdem, wie ich die Dinge tun.

Zum Beispiel, wenn Sie auf das "x" klicken, wird dieser Alarm aus der Liste gelöscht (zeigt mir, wie zu tun und lassen Sie den Adapter wissen, dass eine Warnung gelöscht wurde, wäre cool) oder klicken Sie auf das Warnbild würde aktivieren/deaktivieren der Alarm (der zwischen den beiden gesehenen Bildern wechseln würde).

Dieser Bildschirm wird von einem MainActivity aufgeblasen, der eine AlertFragment aufbläst. In der Vergangenheit hatte ich Probleme mit der Implementierung innerer Klassen, aber die Art und Weise, wie ich sie eingerichtet habe, ist (denke ich) mit Fragmenten, die innere Klassen implementieren. Dies ist, was ich derzeit habe, was ich weiß, ist falsch:

public class AlertsFragment extends Fragment { 

    private ListView mListView; 
    private List<Alert> alerts = new ArrayList<>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_alerts, container, false); 

     mListView = (ListView) rootView.findViewById(R.id.alerts_list_view); 

     alerts.add(new Alert(1, 5400, true)); 
     alerts.add(new Alert(2, 120, false)); 

     AlertsAdapter adapter = new AlertsAdapter(getActivity(), R.layout.alert_item_row, alerts); 
     mListView.setAdapter(adapter); 

     getActivity().setTitle(new AlertsItem().getLabel()); 

     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { 
       Log.d("matt", "list_item"); 
       ImageView img = (ImageView) getActivity().findViewById(R.id.active_image); 
       img.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
         Log.d("matt", "image"); 
         alerts.get(position).setActive(!alerts.get(position).isActive()); 
        } 
       }); 
      } 
     }); 
     return rootView; 
    } 
} 

Jede Hilfe, die Sie geben können, würde geschätzt werden, danke.

---------------------------------------------- ----------- EDIT -------------------------------------- -------------------

Wie einige, hier angefordert ist mein ArrayAdapter Code:

/** 
* Adapter for adding Alerts to ListView 
*/ 
public class AlertsAdapter extends ArrayAdapter { 

    private int resource; 
    List<Alert> objects; 

    public AlertsAdapter(Context context, int resource, List<Alert> objects) { 
     super(context, resource, objects); 
     this.resource = resource; 
     this.objects = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     AlertHolder holder = null; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity)getContext()).getLayoutInflater(); 
      row = inflater.inflate(resource, parent, false); 

      holder = new AlertHolder(); 
       holder.imgActive = (ImageView)row.findViewById(R.id.active_image); 
      holder.txtTitle = (TextView)row.findViewById(R.id.txt_title); 
      holder.txtTime = (TextView)row.findViewById(R.id.txt_time); 

      row.setTag(holder); 
     } 
     else { 
      holder = (AlertHolder)row.getTag(); 
     } 

     Alert alert = (Alert) getItem(position); 
     int image; 
     if (alert.isActive()) { 
      image = R.drawable.ic_alert_active_medium; 
     } 
     else { 
      image = R.drawable.ic_alert_inactive_medium; 
     } 

     holder.imgActive.setImageResource(image); 
     holder.txtTitle.setText("Route " + Integer.toString(alert.getRoute())); 

     int min = alert.getTime()/60; 
     int hr = min/60; 
     min = min % 60; 

     holder.txtTime.setText(((hr == 0) ? "" : (Integer.toString(hr) + " hr ")) + Integer.toString(min) + " min "); 

     return row; 
    } 

    private static class AlertHolder { 
     ImageView imgActive; 
     TextView txtTitle; 
     TextView txtTime; 
    } 
} 
+0

Versuchen Sie, 'android: gravity =" center "' zu 'GridView' hinzuzufügen? –

+0

Das ist nicht, was ich frage, ich frage, wie man einen onClickListener für die Bilder aufstellt. – argetlam5

+0

Fügen Sie Ihren benutzerdefinierten ArrayAdapter-Code hinzu. Wenn Sie die verschiedenen Teile eines Zeilenelements aufblasen, fügen Sie die OnClickListeners hinzu. – Enpi

Antwort

2

Ihre eigene Adapter erstellen, die die ArrayAdapter erstreckt (siehe this link), überschreiben Sie die getView() Methode und dort können Sie OnClickListener s zu jedem View in der ListView 's Kind hinzufügen. Um das ListView zu benachrichtigen, dass ein untergeordnetes Gerät entfernt wurde, rufen Sie notifyDataSetChanged() auf ListViewAdapter.

könnten Sie lösen diese die ListView, aber ich würde die RecyclerView (Android RecyclerView) vorschlagen, mit. RecyclerView hat bessere Unterstützung für die Aktualisierung seiner Kinder (wie Entfernen, Einfügen, Aktualisieren von Kindern) und hat Standard-Animationen eingestellt.

+0

Wie würde ich ein Element aus dem ListView-Datensatz aus diesen entfernen? Zum Beispiel, wenn ich auf das x klicke, möchte ich, dass es gelöscht wird. Ich habe es fast geschafft, aber es ist im Laufe der Zeit durcheinander gekommen, Warnungen hinzuzufügen und zu entfernen. – argetlam5

+0

Darüber hinaus war 'RecyclerView's Fehlen eines' OnItemClickListener' aus diesem Grund, glaube ich. Es soll manuell eingerichtet werden, damit solche Fälle behandelt werden können. – mtrewartha

0

Sie müssen Klick-Listener in AlertsAdapter-Klasse für separate Ansichten wie x-Schaltfläche, Bild verwalten.

0

Sie können dies in OnClick-Methode behandeln. Beispiel;

public MyViewHolder(final View itemView) { 
     super(itemView); 

     iconImageView = (ImageView) itemView.findViewById(R.id.myRecyclerImageView); 
     iconTextView = (TextView) itemView.findViewById(R.id.myRecyclerTextView); 

     itemView.setOnClickListener(this); 
     iconTextView.setOnClickListener(this); 
     iconImageView.setOnLongClickListener(this); 
    } 

    // onClick Listener for view 
    @Override 
    public void onClick(View v) { 

     if (v.getId() == iconTextView.getId()){ 
      Toast.makeText(v.getContext(), "ITEM PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show(); 
     } 
    } 
Verwandte Themen