2016-04-01 8 views
1

私は、リストビューで項目をアルファベット順と数値順に並べ替えようとしています。基本的に、ユーザがスピナー項目を選択すると、リストビューは選択したオプションに従ってソートされます。これはカスタムアダプタを使用したカスタムリストビューなので、実際に正しく並べ替える方法を見つけるためにいくつかの問題がありました。誰かが私にこれについてどうやって行くことができるかについて私に助言を与えることができれば、それは非常に高く評価されるだろう。以下 は、私がリストビューを表示するを扱うメインクラスのため、今持っているものです。Spinnerを使用してカスタムリストビューアイテムを並べ替える

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

それ以下は、各リストビュー項目に見られる属性を設定することを扱う私のカスタムアダプタクラスの一部です:以下は

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

オーバーフローメニューでソートするオプションを指定しないでください。次に、アダプタからのデータを取得するだけで、クライアントがソートしてnotifydatasetの変更を呼び出す方法をソートします。私は同じコードを書いて欲しいのですか? – dex

+0

ええと...私はあなたが念頭に置いているものを見て喜んでいるだろう。 –

+0

オーバーフローメニュー[つまりアクションバー]でソートオプションを指定すると、ソート(listArray)をトリガーし、ソート後にnotifyDatasetメソッドを呼び出すことによって、1つのクライアントがソートオプションを選択します。 – dex

答えて

1

のサンプルコードで、あなたが見ていると、あなたのコードに同じことを実現することができます。..

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; 
    } 
} 

、あなたが呼び出す必要がありますかスピナーでは、

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

ありがとうございます!それは素晴らしい作品です! –

関連する問題