1

I implement a JSONArray to populate a ListView. Now I want to sort the items on the ListActivity alphabetically by its name, which is its Object Attribute. How am I able to sort it out?

Heres the Object class I use to implement the ListView:

public class VideoLocation {

    public String deleted_at = null;
    public int documentary_video_length = -1;
    public int id = -1;
    public double latitude = 0d;
    public double longitude = 0d;
    public int position = -1;
    public String updated_at = null;
    public String name = null;
    public String text = null;
    public String documentary_video_url = null;
    public String documentary_thumbnail_url = null;
    public String audio_text_url = null;
    public Footage[] footages = null;

    public VideoLocation(){

    }

and here's the ListActivity Class:

    public class ProjectsList extends ListActivity implements OnItemClickListener, VideoLocationReceiver{
        /** Called when the activity is first created. */

        private VideoLocation[] videoLocations = null;
        private VideoLocationAdapter videoLocationAdapter = null;

        @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.projects_list);

            doSync();
            //storeSharedPrefs();
            ListView lv = getListView();
            lv.setOnItemClickListener(this);

            videoLocationAdapter = new VideoLocationAdapter(ProjectsList.this, 
                    R.layout.listitems, 
                    new VideoLocation[0]);
            lv.setAdapter(videoLocationAdapter);

            //CREATE VideoLocation[] from Database!

            JsonDB dbhelper = new JsonDB(ProjectsList.this);
            SQLiteDatabase db = dbhelper.getWritableDatabase();

            db.beginTransaction();
            videoLocations = dbhelper.getVideoLocations(db);
            db.setTransactionSuccessful();//end transaction
            db.endTransaction();
            db.close();
        }

        @Override
        public void onResume(){
            super.onResume();
            DBSync.setVideoLocationReceiver(ProjectsList.this);
        }

        @Override
        public void onPause(){
            super.onResume();
            DBSync.setVideoLocationReceiver(null);
        }

        @Override
        public void onItemClick(AdapterView<?> l, View v, int position, long id) {
            Intent listIntent = new Intent(this, ProjectDetailsActivity.class);

            VideoLocation vidLocation = videoLocations[position];
        listIntent.putExtra("documentary_video_url",vidLocation.documentary_video_url);
            startActivity(listIntent);

        }
protected void storeSharedPrefs() {
        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        if (prefs.getBoolean("first-time", true)) {
            doSync();
            prefs.edit().putBoolean("first-time", false).commit(); // record the fact that the app has been started at least once
        }
    } 

    void doSync() {
        Intent serviceIntent = new Intent(this, DBSync.class);
        startService(serviceIntent);
    }

    public class VideoLocationAdapter extends ArrayAdapter<VideoLocation> {
        public ImageLoader imageLoader; 
        ImageLoader loader = null;

        public VideoLocationAdapter(Context context, int resource, VideoLocation[] vidLocs) {
            super(context, resource, vidLocs);
            ProjectsList.this.videoLocations = vidLocs;       
            loader = new ImageLoader(context);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if(convertView == null){
                convertView = ProjectsList.this.getLayoutInflater().inflate(R.layout.listitems, null, true);
            }

            VideoLocation vidLocation = videoLocations[position];
            ImageView v = (ImageView)convertView.findViewById(R.id.image);
            String url = vidLocation.documentary_thumbnail_url;
            v.setTag(url);
            loader.DisplayImage(url, ProjectsList.this, v);
            TextView titleView = (TextView)convertView.findViewById(R.id.txt_title);
            titleView.setText(vidLocation.name);
            return convertView;
        }

        @Override
        public int getCount(){
            return videoLocations==null?0:videoLocations.length;
        }

        @Override
        public VideoLocation getItem(int position){
            return videoLocations[position];
        }

        @Override
        public boolean hasStableIds(){
            return true;
        }

        @Override
        public boolean isEnabled(int position){
            return true;
        }

        @Override
        public long getItemId(int position){
            return videoLocations[position].id;
        }

        public void setVideoLocationData(VideoLocation[] newData){
            ProjectsList.this.videoLocations = newData;
            VideoLocationAdapter.this.notifyDataSetChanged();
        }
    }

    @Override
    public void receivedVideoLocationData(VideoLocation[] vidLocs) {
        final VideoLocation[] locs = vidLocs;

        if (vidLocs==null) {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {

                    //show popup and inform about missing network
                }
            });
        }else{
            runOnUiThread(new Runnable() {

                @Override
                public void run() {

                    videoLocationAdapter.setVideoLocationData(locs);
                    Log.d("ProjectsList", "updating video locations...");
                }
            });
        }
    }

}

2 Answers 2

4

Use Collections.sort. Parse your json and fill up a vector or an ArrayList (I think) with instance of VideoLocation. Then call Collections.sort.

Edit:

Collections.sort(youarrayList, new Comparator<VideoLocation>() {

            @Override
            public int compare(VideoLocation lhs, VideoLocation rhs) {
                return lhs.name.compareTo(rhs.name);
            }
        });
Sign up to request clarification or add additional context in comments.

2 Comments

I have it parsed already. In my ListActivity I use vidLocation.name for example to call the String into the activity. Would be a very nice of you if you could show me how to implement it on my code. Thank you
since I use a normal Array I decided to use Arrays instead of Collections based on your snippet! Thank you!
0

In getVideoLocations(db), you may tell your query to return result as sorted by using ORDER BY [Column]

2 Comments

unfortunately I dont save the table and its columns based on the Object and its Attributes. It only saves the whole Attributes of each Location as a String for each column
hmmm then i guess @blackbelt's answer will help you in this case

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.