Listview Filtern. Probleme beim Klick auf ein Item

R

Raidri

Ambitioniertes Mitglied
1
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();
    }
 
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
 
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
 
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
 

Ähnliche Themen

J
Antworten
5
Aufrufe
930
swa00
swa00
A
Antworten
10
Aufrufe
1.021
swa00
swa00
C
Antworten
8
Aufrufe
1.127
swa00
swa00
Zurück
Oben Unten