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;
}
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
Hmmm ... Ich wäre bereit zu sehen, was Sie vorhaben. –
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