按ListView字母顺序排序数据

时间:2014-10-06 09:53:15

标签: android listview alphabetical-sort

我需要有关如何按ListView字母顺序列出数据的帮助。如果我向foldeData添加更多数据,如果我不必手动移动现有数据以便按字母顺序列出它们将会很好。

我复制了MainActivity的部分代码:

import java.util.concurrent.TimeUnit;
import android.support.v7.app.ActionBarActivity;
import com.google.android.gms.ads.*;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;


public class MainActivity extends ActionBarActivity implements OnClickListener {

    TextView minPastaTimer, maxPastaTimer, tv_start, tv_stop, choice; 

    int minTid, maxTid;

    private ListView listViewArticles;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);


        Folder[] folderData = new Folder[4];    



       folderData[0] = new Folder(R.drawable.icon_music_folder, "Acomo Pepe", (getString(R.string.acomo_pepe)), "Kogetid 9-10min");
       folderData[1] = new Folder(R.drawable.icon_music_folder, "Bucatini", (getString(R.string.Bucatini)),"Kogetid 9-10min");
       folderData[2] = new Folder(R.drawable.icon_music_folder, "Bumbola", (getString(R.string.Bumbola)),"Kogetid 9-10min");
       folderData[3] = new Folder(R.drawable.icon_music_folder, "Cannelloni", (getString(R.string.Cannelloni)),"Kogetid 9-10min");





       FolderAdapter adapter = new FolderAdapter(this,
               R.layout.listview_item_row, folderData);



       listViewArticles = (ListView) findViewById(R.id.listView1);
       listViewArticles.setAdapter(adapter);

    minPastaTimer = (TextView) findViewById(R.id.minPastaTimer);
    minPastaTimer.setText("00:00:00");
    maxPastaTimer = (TextView) findViewById(R.id.maxPastaTimer);
    choice = (TextView) findViewById(R.id.tv_choice);
    maxPastaTimer.setText("00:00:00");
    Button btn_italy = (Button) findViewById(R.id.btn_italy);
    Button btn_danish = (Button) findViewById(R.id.btn_danish);

    tv_start = (TextView) findViewById(R.id.tv_start);
    tv_start.setOnClickListener(this);
    tv_stop = (TextView) findViewById(R.id.tv_stop);
    tv_stop.setOnClickListener(this);


    listViewArticles.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

           String listItemText = ((TextView) view
                    .findViewById(R.id.textViewFolderName))
                    .getText()
                    .toString();

            Toast.makeText(MainActivity.this,
                    "You clicked: " + listItemText, Toast.LENGTH_LONG)
                    .show();       

           if (listItemText.equals("Acomo Pepe")){
              minTid=10000;
              maxTid=20000;
              choice.setText("Acomo Pepe: " + (getString(R.string.acomo_pepe)));
              minPastaTimer.setText("00:08:00");
              maxPastaTimer.setText("00:09:00");
           }
           else if (listItemText.equals("Bucatini")){
            minTid=540000;
            maxTid=600000;
            choice.setText("Bucatini - Kogetid: " + (minTid/60/1000) + ("-") +(maxTid/60/1000) + ("min"));
            minPastaTimer.setText("00:09:00");
            maxPastaTimer.setText("00:10:00");
           }   
           else if (listItemText.equals("Bumbola")){
                minTid=15000;
                maxTid=30000;
                minPastaTimer.setText("00:10:00");
                maxPastaTimer.setText("00:11:00");
              }
           else if (listItemText.equals("Cannelloni")){
                minTid=15000;
            maxTid=30000;
            minPastaTimer.setText("00:11:00");
            maxPastaTimer.setText("00:12:00");
            }  


        }
    });  

FolderAdapter:

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class FolderAdapter extends ArrayAdapter<Folder> {

    Context mContext;
    int layoutResourceId;
    Folder data[] = null;


     // @mContext - app context

     // @layoutResourceId - the listview_item_row.xml

     // @data - the ListItem data

    public FolderAdapter(Context mContext, int layoutResourceId, Folder[] data) {

        super(mContext, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.mContext = mContext;
        this.data = data;
    }


     // @We'll overried the getView method which is called for every ListItem we have.

     // @There are lots of different caching techniques for Android ListView to
     // achieve better performace especially if you are going to have a very long ListView.

     // @convertView - the cache of list item row layout, if it is null, inflate new

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

        if(convertView==null){
            // inflate the listview_item_row.xml parent
            LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
            convertView = inflater.inflate(layoutResourceId, parent, false);
        }

        // get the elements in the layout
        ImageView imageViewFolderIcon = (ImageView) convertView.findViewById(R.id.imageViewFolderIcon);
        TextView textViewFolderName = (TextView) convertView.findViewById(R.id.textViewFolderName);
        TextView textViewFolderDescription = (TextView) convertView.findViewById(R.id.textViewFolderDescription);
        TextView textViewFolderBoilTime = (TextView) convertView.findViewById(R.id.textViewFolderBoilTime);


        // Set the data for the list item. You can also set tags here if you want.

        Folder folder = data[position];

        imageViewFolderIcon.setImageResource(folder.folderIcon);
        textViewFolderName.setText(folder.folderName);
        textViewFolderDescription.setText(folder.folderDescription);
        textViewFolderBoilTime.setText(folder.folderBoilTime);

        return convertView;
    }

}

2 个答案:

答案 0 :(得分:0)

我认为最佳实践是在调用adaptor.notifyDataChanged()方法之前对列表进行排序。好的是你不必手动操作,只需使用比较器进行分类。

您可以看到比较器example in this link

答案 1 :(得分:0)

不使用数组作为列表的数据源,而是首先使用List。至少,这个类扩展了Collection。

您可以定义比较器(例如,在自定义类型上定义compareTo())并在显示之前对其进行排序:

Collections.sort(<your_list>);

编辑:有关一般收藏品订购,请参阅Guava