如何在自定义ListView中按字母顺序排序

时间:2015-12-18 09:01:31

标签: java android sorting listview android-listview

我需要在自定义ListView中按字母顺序排序。在list_item中,我有TextImage和两个TextView(应用程序名称,包名称),并且不能理解按字母表应用名称排序的方式:

我的列表项目:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/app_icon"
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:padding="4dp"
        android:scaleType="centerCrop"
        android:contentDescription="@null"
        tools:src="@mipmap/ic_launcher" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center|center_vertical"
        android:orientation="vertical"
        android:paddingLeft="8dp">

        <TextView
            android:id="@+id/tv_app_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:textStyle="bold"
            tools:text="Application name"/>

        <TextView
            android:id="@+id/tv_app_package"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:textStyle="bold"
            tools:text="app.package.name"/>

    </LinearLayout>

</LinearLayout>

我的适配器:

public class ListViewAdapter extends ArrayAdapter{

    private Context context;
    private List mItem;
    private PackageManager packageManager;

    public ListViewAdapter(Context context, int list_item, List items) {
        super(context, R.layout.list_item, items);

        this.context = context;
        this.mItem = items;
        packageManager = context.getPackageManager();
    }


    public int getCount(){
        return ((null != mItem) ? mItem.size() : 0);
    }

    @Override
    public ApplicationInfo getItem(int position) {
        return (null != mItem) ? (ApplicationInfo) mItem.get(position) : null;
    }
    public long getItemId(int position){
        return position;
    }


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

        View view = convertView;

        if (null == view) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.list_item, null);
        }

        ApplicationInfo data = (ApplicationInfo) mItem.get(position);

        if (null != data){
            TextView appName = (TextView) view.findViewById(R.id.tv_app_name);
            TextView appPackage = (TextView) view.findViewById(R.id.tv_app_package);
            ImageView icon = (ImageView) view.findViewById(R.id.app_icon);

            appName.setText(data.loadLabel(packageManager));
            appPackage.setText(data.packageName);
            icon.setImageDrawable(data.loadIcon(packageManager));
        }


        return view;
    }
}

我的片段显示ListView

public class ResultFragment extends ListFragment {
    private PackageManager packageManager = null;
    private ListViewAdapter listViewAdapter = null;

    private List mItem;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        packageManager = getContext().getPackageManager();

        new LoadApplications().execute();
    }


    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        ApplicationInfo applicationInfo = (ApplicationInfo) mItem.get(position);

        try{
            Intent intent = packageManager.getLaunchIntentForPackage(applicationInfo.packageName);
            if (intent != null){
                startActivity(intent);
            }
        }catch (ActivityNotFoundException e){
            Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show();
        }catch (Exception e){
            Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    private List<ApplicationInfo> checkForLauncherIntent(List<ApplicationInfo> list){

        ArrayList mItem = new ArrayList();

        for(ApplicationInfo info : list) {
            try{
                if(packageManager.getLaunchIntentForPackage(info.packageName) != null) {
                    mItem.add(info);
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
        return mItem;
    }

    private class LoadApplications extends AsyncTask<Void, Void, Void>{

        private ProgressDialog progressDialog = null;

        @Override
        protected Void doInBackground(Void... params){
            mItem = checkForLauncherIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));

            listViewAdapter = new ListViewAdapter(getActivity(), R.layout.list_item, mItem);


            return null;
        }


        @Override
        protected void onPostExecute(Void result){
            setListAdapter(listViewAdapter);
            progressDialog.dismiss();
            super.onPostExecute(result);
        }
        @Override
        protected void onPreExecute(){
            progressDialog = ProgressDialog.show(getActivity(), null, "Loading file info...");
            super.onPreExecute();
        }
    }

}

请按字母顺序排列我的列表来帮助我。

5 个答案:

答案 0 :(得分:0)

首先改变中文拼音你可以使用jar pinyin4j-2.5.0.jar
那么也许你可以尝试这种方法
Arrays.sort(arrayList,String.CASE_INSENSITIVE_ORDER);

答案 1 :(得分:0)

来自Android文档

  

public abstract android.content.Intent   getLaunchIntentForPackage(java.lang.String packageName)

     

返回一个   &#34;良好&#34;意图在包中启动前门活动。这是   例如,用于实现&#34; open&#34;浏览时按钮   包。当前实现首先查看主要活动   在Intent.CATEGORY_INFO类别中,以及下一个主要活动   类别Intent.CATEGORY_LAUNCHER。如果两者都不返回null   找到。

     

参数:packageName - 要检查的包的名称。

     

返回:可用于启动main的完全限定的Intent   包中的活动。如果包不包含,则返回null   此类活动,或者如果无法识别packageName。

您需要对代码进行一些更改

protected static class BackgroundTask extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() {
    //while (!isCancelled()) {
    Build_JobParams.runJob();
    //}
    return null;
}
在你的asn任务中

private ArrayList<ResolveInfo> checkForLauncherIntent(List<ApplicationInfo> list){

    ArrayList<ResolveInfo> mItems = new ArrayList();

    for(ApplicationInfo info : list) {
        try{
            if(packageManager.getLaunchIntentForPackage(info.packageName) != null) {
                Intent intent = packageManager.getLaunchIntentForPackage(info.packageName));
ResolveInfo app = packageManager.resolveActivity(intent,0);
mItems.add(app);
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    return mItems;
}

在适配器构造函数

private class LoadApplications extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... params){
       ArrayList<ResolveInfo> mItem = checkForLauncherIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));

      listViewAdapter = new ListViewAdapter(ctx, mItem);


        return null;
    }


    @Override
    protected void onPostExecute(Void result){
        super.onPostExecute(result);
        listView.setAdapter(listViewAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ResolveInfo resolveInfo = listViewAdapter.getItem(position);
                ActivityInfo activityInfo = resolveInfo.activityInfo;
                ComponentName name = new ComponentName(activityInfo.applicationInfo.packageName,activityInfo.name);

                Intent intent = new Intent();
                intent.setComponent(name);
                startActivity(intent);
            }
        });

    }
    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        //progressDialog = ProgressDialog.show(getActivity(), null, "Loading file info...");

    }
}

helping

查找整个项目At Github

答案 2 :(得分:0)

这样做会起作用

像这样创建一个类比较器

public class CustomComparator implements Comparator<ApplicationInfo> {
        @Override
        public int compare(ApplicationInfo o1, ApplicationInfo o2) {
            return o1.loadLabel(packageManager).toString().compareTo(o2.loadLabel(packageManager).toString());
        }
    }

现在在创建适配器的异步任务中使用此类

Collections.sort(mItem, new CustomComparator());
listViewAdapter = new ListViewAdapter(context, mItem);

它会对您的列表进行排序

如果有更多问题,请告诉我

答案 3 :(得分:0)

当您需要在listview中进行排序时,请使用此方法

Collections.sort(apps, new Comparator<App>() {

                @Override
                public int compare(App lhs, App rhs) {
                         //here getTitle() method return app name...
                    return lhs.getTitle().compareTo(rhs.getTitle());

                }
            });

答案 4 :(得分:0)

请尝试这个。

public class MainActivity extends AppCompatActivity {
    private ArrayList<UserInfo> userInfos;
    private CustomListAdapter customListAdapter;
    private ListView customListView;
    private String[] names={
            "3 Khan",
            "2 Ahmed",
            "1 Iqbal"

    };
    private String[] professions={
            "Rank 1",
            "Rank 2",
            "Rank 3"

    };
    private int[] photos={
            R.drawable.sample_5,
            R.drawable.sample_1,
            R.drawable.sample_6

    };




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setSupportActionBar((Toolbar)findViewById(R.id.toolbar));
        customListView=(ListView)findViewById(R.id.custom_list_view);
        userInfos=new ArrayList<>();
        Arrays.sort(names,String.CASE_INSENSITIVE_ORDER);
        customListAdapter=new CustomListAdapter(userInfos,this);
        customListView.setAdapter(customListAdapter);
        getDatas();
        customListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(MainActivity.this, "Name : " + names[i] + "\n Profession : " + professions[i], Toast.LENGTH_SHORT).show();
            }
        });
    }

    // getting all the datas
    private void getDatas(){
        for(int count=0;count<names.length;count++){
            userInfos.add(new UserInfo(names[count],professions[count],photos[count]));
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search_option,menu);
        MenuItem menuItem=menu.findItem(R.id.search);
        SearchView searchView=(SearchView)menuItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                newText=newText.toString();
                ArrayList<UserInfo> newUserInfos=new ArrayList<>();

                for(UserInfo userInfo:userInfos){
                    String name=userInfo.getName().toLowerCase();
                    String profession=userInfo.getProfession().toLowerCase();
                    if(name.contains(newText) || profession.contains(newText)){
                        newUserInfos.add(userInfo);
                    }
                }
                customListAdapter.filterResult(newUserInfos);
                customListAdapter.notifyDataSetChanged();
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }
}```