Listview Filtern. Probleme beim Klick auf ein Item

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Raidri, 13.04.2010.

  1. Raidri, 13.04.2010 #1
    Raidri

    Raidri Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    27.03.2010
    Hey,

    Habe ein Problem beim Filtern einer ListView.
    In meiner ListView sind verschiedene Objekte die über ein inputfeld beim drücken eines buchstabens gefiltert werden. FUnktioniert auch wunderbar.

    Nur wenn ich jetzt die gefilterte Ansicht habe und dann auf das erste Item Klicke, so bekomme ich das item, das bei der nicht gefilterten Liste auf der ersten Position stand. Ich habe mir das beim Filtern eigentlich so gedacht, selbst wenn das item nun ganz oben steht, hat es weiterhin die position von der nicht gefilterten liste, aber da lag ich wohl Falsch und nun weiss ich nicht wie ich das ändern kann.

    Hier mal mein Code vom Adapter:
    Code:
    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            
            if (v == null)  {
                LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.list_projects, null);
            }
            Project project = filteredProjects.get(position);
            if(project != null){
                TextView topText = (TextView)v.findViewById(R.id.toptextproject);
                TextView bottomText = (TextView)v.findViewById(R.id.bottomtextproject);
                
                topText.setText(project.getName());
                bottomText.setText((project.getCname()=="") ? "-" : project.getCname());
            }
            return v;
        }
        
        @Override
        public Filter getFilter(){
            if(this.filter == null){
                filter = new ProjectFilter();
            }
            
            return filter;
        }
        
        @Override
        public int getCount(){
            return filteredProjects.size();
        }
        
        private class ProjectFilter extends Filter {
            
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                ArrayList<Project> projects = new ArrayList<Project>();
                FilterResults results = new FilterResults();
                
                if(constraint.length() > 0){
                    for(Project project: allProjects){
                        if(project.getName().contains(constraint)){
                            projects.add(project);
                        }
                    }
                    
                    results.values = projects;
                    results.count = projects.size();
                }
                else{
                    results.values = allProjects;
                    results.count = allProjects.size();
                }
                return results;
            }
    
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                filteredProjects = (ArrayList<Project>)results.values;
            }
    
        }
    
    Und hier der listener der auf ein ItemClick reagiert, ist eine ausgelagerte Klasse:
    Code:
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ListView list = (ListView)parent;
            this.command.setData(list.getItemAtPosition(position));
            
            this.command.execute();
        }
    
     
  2. Raidri, 14.04.2010 #2
    Raidri

    Raidri Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    27.03.2010
    Keiner eine Idee ? Oder vllt war ich ja zu undeutlich :).

    Ich mache mal ein Beispiel dazu.
    Ich habe eine liste wo objekte drin stehen:

    ungefilterte Liste
    ----------------
    Object A
    Object B
    Object C
    Object BB

    gefilterte Liste ( nach B)
    --------------
    Object B
    Object BB

    Wenn ich jetzt bei der gefilterten Liste "Object B" anklicke, um es zu editieren, öffnet sich das Fenster mit den Daten von "Object A". und bei "Object BB" öffnen sich dann die Daten von "Object B".

    Vllt jetzt besser :x. Komme da zur Zeit nicht mit weiter
     
  3. klausa2, 14.04.2010 #3
    klausa2

    klausa2 Fortgeschrittenes Mitglied

    Beiträge:
    298
    Erhaltene Danke:
    20
    Registriert seit:
    08.07.2009
    An welche Collection hast Du den Adapter gebunden, Projects oder FilteredProjects? Ich vermute mal, an Projects, sonst hättest Du keinen filter gebraucht. Wenn Du nun ein item anklickst erhätst Du im Listener die Position und das item der gebundenen Collection, also der Projects, da sich der Adapter keine kopie der Filtered Objcts merkt, und ihm die Filterabbildung bzw. deren Inverse unbekannt sind.

    Lösungen

    1: Selbst filtern und den Adapter an die gefilterte Collection binden.

    2. Die vom Adapter gelieferte Position nutzen, m das zugehörige Projekt selbst zu ermitteln.

    3. Die (hoffentlich eindeutige) id nutzen, um das Projekt zu finden.

    Gruss - Klaus
     
  4. Raidri, 15.04.2010 #4
    Raidri

    Raidri Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    27.03.2010
    Danke erstmal.
    Ich habe die Lösung gefunden.

    Einfach mal beim Adapter die getItem() methode überschreiben ;) und halt nur von der gefilterten ArrayList das item holen -.-. hätte man auch früher drauf kommen können :p
     

Diese Seite empfehlen