java - Android搜索(EditText)功能在fragment ExpandableListView中

标签 java android android-fragments search expandablelistview

需要一些帮助来在我的 Android 应用程序中实现搜索功能,该应用程序在 fragment 中显示 expandablelistview。我在网上找到了很多示例,但没有一个具有相同的方法(Fragment + Expandablelistview)。

Expandable_adapter 类

import java.util.ArrayList;
import java.util.HashMap;

import java.util.Map;

import android.content.Context;
import android.graphics.Typeface;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.genesysci.leo.R;
import com.genesysci.leo.others.Child;

public class Expandable_adapter extends BaseExpandableListAdapter{


    private final int VIEW_ITEM = 1;
    private final int VIEW_PROG = 0;

    // The minimum amount of items to have below your current scroll position
    // before loading more.
    private int visibleThreshold = 5;
    private int lastVisibleItem, totalItemCount;
    private Context _context;
    private ArrayList<String>_listDataHeader;
    private HashMap<String, ArrayList<Child>> _listDataChild;
    private HashMap<String, ArrayList<Child>> _listDataChildTemp;
    //= new HashMap <String, ArrayList<Child>>();

    public Expandable_adapter(Context context, ArrayList<String> listDataHeader, HashMap<String, ArrayList<Child>> listDataChild) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listDataChild;
        this._listDataChildTemp = new HashMap<String, ArrayList<Child>>();
        _listDataChildTemp.putAll(_listDataChild);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        //final String childText = (String) getChild(groupPosition, childPosition);
        Child child = (Child) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_child, null);

        }
        TextView expandedListTextView = (TextView) convertView.findViewById(R.id.tv_listchild);
        ImageView image = (ImageView) convertView.findViewById(R.id.img);
        image.setImageBitmap(child.getImage());
        ImageView image2 = (ImageView) convertView.findViewById(R.id.img2);
        image2.setImageBitmap(child.getImage());


        String toto = " ";
        String toto1 = " ";
        if (child.getName() != null) {
            toto = child.getName();
        }
        else {
            toto = "";
        }

        if (child.getSubject() != null) {
            toto1 = child.getSubject();
        }
        else {
            toto1 = "";
        }
        expandedListTextView.setText(Html.fromHtml(toto + " " + toto1));

        //expandedListTextView.setText(Html.fromHtml(childText));
        expandedListTextView.setMovementMethod(LinkMovementMethod.getInstance());
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_group, null);
        }
        TextView listTitle = (TextView) convertView.findViewById(R.id.tv_listtitle);
        listTitle.setTypeface(null, Typeface.BOLD);
        listTitle.setText(headerTitle);
        return convertView;
    }

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

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    public void filter (String text) {
        _listDataChild.clear();

        //HashSet<String> headerData = new HashSet<String>();
        //Map<String, String> map = new HashMap<String, String>();

        //HashMap<String, ArrayList<Child>> _listDataChildTemp = new HashMap<String, ArrayList<Child>>();

        ArrayList<Child> testData = null;
        //Child testData = null;

        if(text.isEmpty()){
            _listDataChildTemp.putAll(_listDataChild);
        }

        else {
            for (Map.Entry <String, ArrayList<Child>> entry : _listDataChildTemp.entrySet()) {

                String key = entry.getKey();

                testData = new ArrayList<Child>();

                if(testData.getClass().getName().toLowerCase().contains(text.toLowerCase())){
                    _listDataChild.put(key,testData);
                }
            }
        }
        notifyDataSetChanged();
    }

}

子类

import android.graphics.Bitmap;

public class Child {

    private String Name;
    private String Subject;
    private Bitmap Image;
    private Bitmap Image2;

    public String getName() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }

    public String getSubject() {
        return Subject;
    }

    public void setSubject(String Subject) {
        this.Subject = Subject;
    }

    public Bitmap getImage() {
        return Image;
    }

    public void setImage(Bitmap Image) {
        this.Image = Image;
    }
}

fragment 类

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;

import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.ImageView;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;


import com.genesysci.leo.R;
import com.genesysci.leo.activity.MainActivity;
import com.genesysci.leo.models.Expandable_adapter;
import com.genesysci.leo.others.Child;
import com.genesysci.leo.others.HttpHandler;


public class UrielFragment extends Fragment{

    private static final String TAG = HttpHandler.class.getSimpleName();

    String url = "http://192.168.8.100/Android/jsonData.php";
    private ProgressDialog mprocessingdialog;
    private TextView tv_welcomeuser, tv_recentupdate;
    ExpandableListAdapter expandableListAdapter;
    private ExpandableListView exp_leaseoffer;
    private ArrayList<String> listDataHeader;
    View rootView;
    ImageView image;


    private HashMap<String, ArrayList<Child>> listDataChild;
    Dialog dialog;
    String flash = "";
    private void save() {
        Toast.makeText(getActivity(), ".............", Toast.LENGTH_SHORT).show();
    }
    private ArrayAdapter<String> adapter;

    public class Wrapper {
        Void result;
        Bitmap decodedByte;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setHasOptionsMenu(true);

        rootView = inflater.inflate(R.layout.wellcome_page, container, false);
        //tv_welcomeuser = (TextView) rootView.findViewById(R.id.tv_welcomeuser);
        //tv_recentupdate = (TextView) rootView.findViewById(R.id.tv_recentupdate);
        //FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab);
        //fab.setTitle("Familie");
        //fab.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.allan1));
        //fab.setIcon(R.drawable.world_map);
        //fab.setSize(FloatingActionButton.SIZE_MINI);
        //fab.setColorNormalResId(R.color.red);
        //fab.setColorPressedResId(R.color.black_semi_transparent);

        image = (ImageView) rootView.findViewById(R.id.img);

        exp_leaseoffer = (ExpandableListView) rootView.findViewById(R.id.lvExp);
        exp_leaseoffer.setGroupIndicator(null);
        exp_leaseoffer.setChildIndicator(null);
        exp_leaseoffer.setChildDivider(getResources().getDrawable(R.color.white));
        exp_leaseoffer.setDividerHeight(0);
        exp_leaseoffer.setTextFilterEnabled(true);

        SearchView  searchview = (SearchView) rootView.findViewById(R.id.search);
        searchview.setIconifiedByDefault(false);
        searchview.setSubmitButtonEnabled(true);
        searchview.setQueryRefinementEnabled(false);
        searchview.setQueryHint("Search");

        searchview.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String text) {

                //can't resolve method filter
                    expandableListAdapter.filter(text);
                return false;
            }
            @Override
            public boolean onQueryTextChange(String text) {

                //can't resolve method filter
                expandableListAdapter.filter(text);
                return false;
            }
        });

        /*fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new DownloadJason().execute();
            }
        });*/

        new DownloadJason().execute();

        return rootView;
    }

    private class DownloadJason extends AsyncTask<Void, Void, Wrapper> {
        String jsonstr = null;

        @Override
        protected void onPreExecute() {

            super.onPreExecute();
            mprocessingdialog = new ProgressDialog(getActivity());
            //mprocessingdialog.setTitle(" Veuillez patienter...");
            mprocessingdialog.setMessage("chargement...");
            mprocessingdialog.setIndeterminate(false);
            mprocessingdialog.show();
        }

        @Override
        protected Wrapper doInBackground(Void... arg0) {

            Wrapper w = new Wrapper();

            listDataHeader = new ArrayList<String>();
            HttpHandler jp = new HttpHandler();
                try {
                    // test si serveur joignable
                    URL urlServer = new URL("http://192.168.8.100");
                    HttpURLConnection urlConn = (HttpURLConnection) urlServer.openConnection();
                    urlConn.setConnectTimeout(3000); //<- 3Seconds Timeout
                    urlConn.connect();
                    // si bon code recu
                    if (urlConn.getResponseCode() == 200) {
                        try {
                            jsonstr = jp.makeServiceCall(url);
                            writeToFile(jsonstr);
                        } catch ( NullPointerException e) {
                            Log.e(TAG, "Exception: " + e.getMessage());
                        }
                    }
                }
                catch (IOException e1) {
                    Log.e(TAG, "IOException: " + e1.getMessage());
                }
                try {
                    // essai lecture locale
                    jsonstr = readFromFile();
                }
                catch ( NullPointerException e) {
                    Log.e(TAG, "NullPointerException: " + e.getMessage());
                }

                listDataHeader = new ArrayList<String>();
                listDataChild = new HashMap<String, ArrayList<Child>>();

            if (jsonstr != null) {

                try {
                    JSONObject jobj = new JSONObject(jsonstr);
                    JSONArray jarray = jobj.getJSONArray("data");
                    for (int hk = 0; hk < jarray.length(); hk++) {
                        JSONObject d = jarray.getJSONObject(hk);
                        String mimi = d.getString("phone_number");

                        if (mimi.equalsIgnoreCase("600")) {
                            flash = "FoudreNoire";
                        }
                        else {
                            flash = "Maracaibo";
                        }


                        // Adding Header data

                        listDataHeader.add(d.getString("name"));

                        // Adding child data for lease offer
                        ArrayList<Child> lease_offer = new ArrayList<Child>();

                        Child ch = new Child();
                        Child ch2 = new Child();
                        Child ch3 = new Child();
                        ch.setName(d.getString("name"));
                        ch3.setSubject(d.getString("subject"));

                        String image = d.getString("phone_number");

                        byte[] decodedString = Base64.decode(image, Base64.DEFAULT);
                        Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0,decodedString.length);
                        ch2.setImage(decodedByte);

                        //lease_offer.add(d.getString("name") + " " + flash + " " + d.getString("id"));
                        //lease_offer.add(d.getString("subject"));
                        //lease_offer.add("Contacts : "+d.getString("phone_number"));
                        lease_offer.add(ch);
                        lease_offer.add(ch2);
                        lease_offer.add(ch3);
                        // Header into Child data
                        listDataChild.put(listDataHeader.get(hk), lease_offer);
                    }
                }
                catch (Exception e) {
                    Log.e(TAG, "Exception: " + e.getMessage());
                    //afficher notification acces internet requis
                    notifyNoConnection();
                }
            }
            else {
                Log.d("Json url view", "Empty");
                // Server call failed
            }

            return w;
        }

        private void writeToFile(String data) {
            try {
                OutputStreamWriter osw = new OutputStreamWriter(getActivity().openFileOutput("18621", Context.MODE_PRIVATE));
                osw.write(data);
                osw.close();
            }
            catch (IOException e) {
                Log.e("Exception", "File write failed: " + e.toString());
            }
        }

        private String readFromFile() {

            String ret = "";

            try {
                InputStream inputStream = getActivity().openFileInput("18621");

                if ( inputStream != null ) {
                    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    String receiveString = "";
                    StringBuilder stringBuilder = new StringBuilder();

                    while ( (receiveString = bufferedReader.readLine()) != null ) {
                        stringBuilder.append(receiveString);
                    }
                    inputStream.close();
                    ret = stringBuilder.toString();
                }
            } catch (FileNotFoundException e) {
                Log.e("login activity", "File not found: " + e.toString());
            } catch (IOException e) {
                Log.e("login activity", "Can not read file: " + e.toString());
            }

            return ret;
        }

        private void notifyNoConnection() {
            Handler handler =  new Handler(getActivity().getMainLooper());
            handler.post( new Runnable(){
                public void run(){
                    noConnection();
                }
            });
        }

        @Override
        protected void onPostExecute(Wrapper w) {
            super.onPostExecute(w);
            mprocessingdialog.dismiss();

            expandableListAdapter = new Expandable_adapter(getActivity(), listDataHeader, listDataChild);


            Log.i("groups", listDataHeader.toString());

            exp_leaseoffer.setAdapter(expandableListAdapter);

            exp_leaseoffer.setOnGroupClickListener(new OnGroupClickListener() {

                @Override
                public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                    return false;
                }
            });
            // Listview Group expanded listener
            exp_leaseoffer.setOnGroupExpandListener(new OnGroupExpandListener() {
                int previousItem = -1;

                @Override
                        public void onGroupExpand(int groupPosition) {
                            if(groupPosition != previousItem )
                                exp_leaseoffer.collapseGroup(previousItem );
                            previousItem = groupPosition;
                        }
                    });
            exp_leaseoffer.setOnGroupCollapseListener(new OnGroupCollapseListener() {

                        @Override
                        public void onGroupCollapse(int groupPosition) {
                        // Toast.makeText(getActivity().getApplicationContext(), listDataHeader.get(groupPosition) + " Collapsed", Toast.LENGTH_SHORT).show();
                        }
                    });
            exp_leaseoffer.setOnChildClickListener(new OnChildClickListener() {

                @Override
                public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                    return false;
                }
            });

        }
        @Override
        protected void onCancelled() {
        }
    }

    public void openDialog() {

        dialog = new Dialog(getActivity());
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.dialog);
        dialog.setCancelable(false);
        TextView m = (TextView) dialog.findViewById(R.id.dialog_info);
        m.setText(R.string.dialog_text);
        final Button n = (Button) dialog.findViewById(R.id.dialog_cancel);
        final Button p = (Button) dialog.findViewById(R.id.dialog_ok);
        dialog.show();
        n.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                dialog.dismiss();
            }
        });
        p.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                getActivity().finish();
            }
        });
    }

    public void noConnection() {

        dialog = new Dialog(getActivity());
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.dialog_retry);
        dialog.setCancelable(false);
        TextView m = (TextView) dialog.findViewById(R.id.retry_dialog);
        m.setText(R.string.dialog_text_no_connection);
        final Button n = (Button) dialog.findViewById(R.id.retry_retry);
        final Button p = (Button) dialog.findViewById(R.id.retry_close);
        dialog.show();
        n.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                new DownloadJason().execute();
                dialog.dismiss();
            }
        });
        p.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                getActivity().finish();
            }
        });
    }

}

最佳答案

请尝试这个,我认为它可以解决您的问题

        SearchView  searchview=  (SearchView)viewlayout.findViewById(R.id.searchview);
        searchview.setIconifiedByDefault(false);
        searchview.setSubmitButtonEnabled(true);
        searchview.setQueryRefinementEnabled(false);
        searchview.setQueryHint("Search by name");
        searchview.setImeOptions(EditorInfo.IME_ACTION_GO);

        searchview.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
        if(unCapAdapter!=null){
        adapter.filter(query);// add filter method in your adapter

        }
        return false;
        }
@Override
public boolean onQueryTextChange(String query) {
        adapter.filter(query);

        return false;
        }
        });

//您的适配器代码

     import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;

        import android.content.Context;
        import android.graphics.Typeface;
        import android.text.Html;
        import android.text.method.LinkMovementMethod;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.BaseExpandableListAdapter;
        import android.widget.ImageView;
        import android.widget.TextView;
        import com.genesysci.leo.R;
        import com.genesysci.leo.others.Child;

public class Expandable_adapter extends BaseExpandableListAdapter{


    private final int VIEW_ITEM = 1;
    private final int VIEW_PROG = 0;

    // The minimum amount of items to have below your current scroll position
    // before loading more.
    private int visibleThreshold = 5;
    private int lastVisibleItem, totalItemCount;
    private Context _context;
    private ArrayList<String>_listDataHeader;
    private HashMap<String, List<Child>> _listDataChild;

    private HashMap<String, ArrayList<Child>> _listDataChildTemp=new HashMap<String, ArrayList<Child>>();


    public Expandable_adapter(Context context, ArrayList<String>      listDataHeader, HashMap<String, List<Child>> listDataChild) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listDataChild;

        _listDataChildTemp.putAll(listChildData);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        //final String childText = (String) getChild(groupPosition, childPosition);
        Child child = (Child) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_child, null);

        }
        TextView expandedListTextView = (TextView) convertView.findViewById(R.id.tv_listchild);
        ImageView image = (ImageView) convertView.findViewById(R.id.img);
        image.setImageBitmap(child.getImage());
        ImageView image2 = (ImageView) convertView.findViewById(R.id.img2);
        image2.setImageBitmap(child.getImage());


        String toto = " ";
        String toto1 = " ";
        if (child.getName() != null) {
            toto = child.getName();
        }
        else {
            toto = "";
        }

        if (child.getSubject() != null) {
            toto1 = child.getSubject();
        }
        else {
            toto1 = "";
        }
        expandedListTextView.setText(Html.fromHtml(toto + " " + toto1));

        //expandedListTextView.setText(Html.fromHtml(childText));
        expandedListTextView.setMovementMethod(LinkMovementMethod.getInstance());
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_group, null);
        }
        TextView listTitle = (TextView) convertView.findViewById(R.id.tv_listtitle);
        listTitle.setTypeface(null, Typeface.BOLD);
        listTitle.setText(headerTitle);
        return convertView;
    }

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

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    public void filter(String text){
        _listDataChild.clear();

        HashSet<String> headerData=new HashSet<String>();
        ArrayList<Child> testData=null;

        if(text.isEmpty()){
            _listDataChild.putAll(_listDataChildTemp);

        }else{
            for (Map.Entry<String, ArrayList<Child>> entry : _listDataChildTemp.entrySet()) {
                String key = entry.getKey();
                testData=new ArrayList<Child>();
                    if(testData.getName().toLowerCase().contains(text.toLowerCase())){
                      _listDataChild.put(key,testData);
                }
            }
        }
        notifyDataSetChanged();
    }
}

关于java - Android搜索(EditText)功能在fragment ExpandableListView中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41476401/

相关文章:

android - ActionBar 预 hive

android - 在Delphi XE7 Android中的Messagedlg

android - Flutter 中即使应用已断开连接,如何查看日志?

android - fragment 无法转换为 android.app.activity

android - 从另一个 Activity 返回时,MapFragment 的 map 加载延迟

java.lang.ExceptionInInitializerError 和 org.hibernate.AnnotationException : mappedBy reference an unknown target entity property:

java - Spring Authentication,如何为错误的凭证自定义responeText

android - 如何更改对话框 fragment 中的 fragment

java - 黑莓 CRC32 问题

java - 使用 EJML 计算线性系统