2016-04-01 13 views
1

Ich versuche, die Elemente in einer ListView sowohl alphabetisch als auch numerisch nach Auswahl des Sortierungsstils mit einem Spinner zu sortieren. Wenn der Benutzer ein Drehfeldelement auswählt, wird die Listenansicht im Wesentlichen nach der ausgewählten Option sortiert. Da es sich um eine benutzerdefinierte Listenansicht mit einem benutzerdefinierten Adapter handelt, habe ich einige Probleme bei der Suche nach einer Möglichkeit gefunden, sie korrekt zu sortieren. Wenn mir jemand einen Rat geben kann, wie ich das anstellen kann, würde ich es sehr schätzen. Unten ist das, was ich jetzt für die Hauptklasse, die mit Anzeigen der Listenansicht Angebote:Sortieren von benutzerdefinierten ListView-Elementen mit Spinner Android

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_repetition_progress); 

    /** 
    * The database used to pull all exercises for this workout routine 
    */ 
    DatabaseHandler db = new DatabaseHandler(this); 
    SQLiteDatabase database = db.getReadableDatabase(); 

    context = this; 


    /** 
    * Get all exercises from Triceps and Chest workout and put in arraylist 
    */ 
    ListView workoutExerciseList = (ListView)findViewById(R.id.listView7); 
    final List<String> arrayRepetitionProgress = new ArrayList<String>(); 
    exListAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, arrayRepetitionProgress); 
    workoutExerciseList.setAdapter(exListAdapter); 

    //Holds all the available exercises 
    final List<WorkoutTracker> exerciseList = db.getRepProgress(context, database); 

    /** 
    * Populates the listView with each exercise for this workout routine. This includes the 
    * each exercise name, the distance, the time of the workout, and any 
    * comments included. 
    */ 
    repProgressList = new ArrayList<RepetitionProgress.ListViewItem>(); 
    for(int i = 0; i<exerciseList.size(); i++) { 
     final int j = i; 
     repProgressList.add(new ListViewItem() 
     {{ 
       REPETITIONS = exerciseList.get(j).getReps(); 
       WEIGHT = exerciseList.get(j).getWeight(); 
       COMMENT = exerciseList.get(j).getComment(); 
       EXERCISE_NAME = exerciseList.get(j).getExerciseName(); 
       DATE = exerciseList.get(j).getDate(); 
      }}); 


    } 
    final RepetitionProgressAdapter adapter = new RepetitionProgressAdapter(this, repProgressList); 
    workoutExerciseList.setAdapter(adapter); 


    //Spinner used to select sorting method 
    SortOptions = (Spinner)findViewById(R.id.sortOption); 
    SortOptions.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

      //If the Sort by exercise name option is chosen 
      if(SortOptions.getSelectedItem().toString().equals("Sort by exercise name")) { 
       Toast.makeText(context.getApplicationContext(), "Sort by exercise name", Toast.LENGTH_LONG).show(); 
       exListAdapter.sort(new Comparator<String>() { 
        @Override 
        public int compare(String lhs, String rhs) { 
         return lhs.compareTo(rhs); 
        } 
       }); 
       //Refresh the listview 
       adapter.notifyDataSetChanged(); 
       exListAdapter.notifyDataSetChanged(); 
      } 


      //If the Sort by date option is chosen 
      if(SortOptions.getSelectedItem().toString().equals("Sort by date")) { 
       Toast.makeText(context.getApplicationContext(), "Sort by date", Toast.LENGTH_LONG).show(); 
      } 

      //If the Sort by number of repetitions option is chosen 
      if(SortOptions.getSelectedItem().toString().equals("Sort by number of repetitions")) { 
       Toast.makeText(context.getApplicationContext(), "Sort by number of repetitions", Toast.LENGTH_LONG).show(); 
      } 

      //If the Sort by weight option is chosen 
      if(SortOptions.getSelectedItem().toString().equals("Sort by weight")) { 
       Toast.makeText(context.getApplicationContext(), "Sort by weight", Toast.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 

     } 
    }); 


    Back = (Button)findViewById(R.id.back); 
    Back.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 
} 

Und Unten ist der Teil meiner benutzerdefinierten Adapter-Klasse, die die Attribute mit der Einrichtung beschäftigt, die in jedem Listenansicht Artikel zu sehen sind:

public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    ListViewItem item = items.get(position); 
    View vi=convertView; 

    if(convertView==null) 
     vi = inflater.inflate(R.layout.rep_progress_view, null); 


    TextView exerciseName = (TextView)vi.findViewById(R.id.FullProgress); 
    TextView exerciseComment = (TextView)vi.findViewById(R.id.Comment); 


    exerciseName.setText(item.EXERCISE_NAME + " Date: " + item.DATE + " Reps: " + item.REPETITIONS + " Weight: " +item.WEIGHT + " Pounds "); 
    exerciseComment.setText(item.COMMENT); 

    return vi; 
} 
+0

Warum geben Sie nicht die Möglichkeit, im Überlaufmenü zu sortieren. Dann haben Sie Daten von Adapter einfach sortieren die Art und Weise client wollte sortieren und notifydataset Änderung aufrufen. Willst du, dass ich einen Code für das gleiche schreibe? – dex

+0

Hmmm ... Ich wäre bereit zu sehen, was Sie vorhaben. –

+0

geben Sortieroption in Überlaufmenü [d. H. Aktionsleiste] und ein Client wählen Sie die Sortieroption entsprechend werden Sie Sort (Ihre listArray) auslösen und nach dem Sortieren Anruf notifyDataset Änderungsmethode. – dex

Antwort

1

Unten ist der Beispielcode, können Sie einen Blick haben und diese zu Ihrem Code implementieren ..

public static void main(String[] args) { 

    List<Item> items = new ArrayList<>(); 
    // constructor Item(name, Id, weight) 
    items.add(new Item("Nelson", 1, 10.3)); 
    items.add(new Item("Fisk", 2, 12.03)); 
    items.add(new Item("Speedy", 3, 19.3)); 
    items.add(new Item("Donna", 4, 12.3)); 
    items.add(new Item("Matt", 5, 16.3)); 
    items.add(new Item("Oliver", 6, 1.3)); 
    items.add(new Item("Deadstroke", 5, 1.3)); 

    Collections.sort(items, new MyComparator(MyComparator.NAME)); 

    for (Item item : items) { 
     System.out.println("Items " + item.getName() + " \t" + item.getWeight()); 
    } 
} 

static class MyComparator implements Comparator<Item> { 
    static final int NAME = 0, WEIGHT = 1, DATE = 2; 
    int type; 

    public MyComparator(int type) { 
     this.type = type; 
    } 

    @Override 
    public int compare(Item o1, Item o2) { 

     if (type == NAME) { 
      return o1.getName().compareTo(o2.getName()); 
     } else if (type == WEIGHT) { 
      if (o1.getWeight() > o2.getWeight()) 
       return 1; 
      else if (o1.getWeight() == o2.getWeight()) 
       return 0; 
      else 
       return -1; 
     } else if (type == DATE) { 
      // now convert your date object/string to milliseconds and apply 
      // number logic (above) 
     } 
     return 0; 
    } 
} 

und wie müssen Sie anrufen in Spinner,

public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
    String selectedItem = parent.getItemAtPosition(position).toString(); 

    if (selectedItem.equals("Sort by exercise name")) { 
     // Collections.sort(items, new MyComparator(MyComparator.NAME)); 
     //replace with your code/array list 
    } else if (selectedItem.equals("Sort by date")) { 
     // Collections.sort(items, new MyComparator(MyComparator.DATE)); 
    } else if (selectedItem.equals("Sort by number of repetitions")) { 
     // Collections.sort(items, new MyComparator(MyComparator.REPTS)); 
    } else if (selectedItem.equals("Sort by weight")) { 
     // Collections.sort(items, new MyComparator(MyComparator.WEIGHT)); 
    } 
    adapter.notifyDataSetChanged(); 
    exListAdapter.notifyDataSetChanged(); 
} 

Happy_Coding;

+0

Vielen Dank! Es funktioniert super! –