lundi 27 juillet 2015

filter listview using search view using sqlite database

I have a list view in a fragment i want to add search function in this using search view. i have a database to get d data. i have tried to write a code for the same but it is not giving the desired result d app crashes on launch. I am new to android platform so not getting the solution. can anyone help..? thnk u.. plz help..

 this is my main drawer activity

    public class MainActivity extends AppCompatActivity  {

         Toolbar mToolbar;
        private DrawerLayout mDrawerLayout;
        NavigationView mNavigationView;
        FrameLayout mContentFrame;
        FragmentManager fragmentManager;
        private static final String PREFERENCES_FILE = "mymaterialapp_settings";
        private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
        private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";

        private boolean mUserLearnedDrawer;
        private boolean mFromSavedInstanceState;
        private int mCurrentSelectedPosition;
        public ArrayList<Item> arrayList;
        ItemAdapter defaultAdapter;
        DBHandler db;
        DBHelper mDbHelper;
       // private ArrayList<Item> nameList;
        ArrayList<Item> array_data;
         SearchView mSearchView;
        ListView listview;
        ListView listView1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_nav_drawer);

            setUpToolbar();
            arrayList=new ArrayList<Item>();
            array_data=new ArrayList<Item>();
           db = new DBHandler(getApplication());
            mDbHelper=new DBHelper(getApplication());

            mDrawerLayout = (DrawerLayout) findViewById(R.id.nav_drawer);

            mUserLearnedDrawer = Boolean.valueOf(readSharedSetting(this, PREF_USER_LEARNED_DRAWER, "false"));

            if (savedInstanceState != null) {
                mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
                mFromSavedInstanceState = true;
            }
            firstTimeFrag();
            setUpNavDrawer();

            mNavigationView = (NavigationView) findViewById(R.id.nav_view);
            mContentFrame = (FrameLayout) findViewById(R.id.nav_contentframe);

            mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    Fragment newFragment;
                    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    menuItem.setChecked(true);
                    switch (menuItem.getItemId()) {
                        case R.id.navigation_item_1:
                            newFragment = new AddStock();
                            transaction.replace(R.id.nav_contentframe, newFragment);
                          //  transaction.addToBackStack(null);
                            transaction.commit();
                            mCurrentSelectedPosition = 0;
                            mDrawerLayout.closeDrawers();
                            return true;
                        case R.id.navigation_item_2:
                            newFragment = new ViewStock();
                            transaction.replace(R.id.nav_contentframe, newFragment);
                         //   transaction.addToBackStack(null);
                            transaction.commit();
                            mCurrentSelectedPosition = 1;
                            mDrawerLayout.closeDrawers();
                            return true;
                        default:
                            return true;
                    }
                }
            });
            //fragmentManager.beginTransaction().replace(R.id.nav_contentframe, fragment).commit();
        }
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
        }
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
            mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION, 0);
            Menu menu = mNavigationView.getMenu();
            menu.getItem(mCurrentSelectedPosition).setChecked(true);
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu_main, menu);
            SearchManager searchManager =
                    (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView =
                    (SearchView) menu.findItem(R.id.search_view).getActionView();
            searchView.setSearchableInfo(
                    searchManager.getSearchableInfo(getComponentName()));
            return true;
        }
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.action_settings:
                    return true;
            }
            switch (item.getItemId())
            {
                case R.id.search_view:
                    Intent i=new Intent(this,Search.class);
            }
            return super.onOptionsItemSelected(item);
        }
        private void setUpToolbar() {
            mToolbar = (Toolbar) findViewById(R.id.toolbar);
            if (mToolbar != null) {
                setSupportActionBar(mToolbar);
            }
        }
        private void setUpNavDrawer() {
            if (mToolbar != null) {
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                mToolbar.setNavigationIcon(R.drawable.ic_drawer);
                mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mDrawerLayout.openDrawer(GravityCompat.START);
                    }
                });
            }
            if (!mUserLearnedDrawer) {
                mDrawerLayout.openDrawer(GravityCompat.START);
                mUserLearnedDrawer = true;
                saveSharedSetting(this, PREF_USER_LEARNED_DRAWER, "true");
            }
        }
        public static void saveSharedSetting(Context ctx, String settingName, String settingValue) {
            SharedPreferences sharedPref = ctx.getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putString(settingName, settingValue);
            editor.apply();
        }

        public static String readSharedSetting(Context ctx, String settingName, String defaultValue) {
            SharedPreferences sharedPref = ctx.getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE);
            return sharedPref.getString(settingName, defaultValue);
        }
        private void firstTimeFrag(){

                Fragment fr = new ViewStock();
                FragmentManager fm = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fm.beginTransaction();
                fragmentTransaction.replace(R.id.nav_contentframe, fr);
                fragmentTransaction.commit();
           }
            return ranBefore;
        }
    }
    this is my search activity

    public class Search extends MainActivity implements SearchView.OnQueryTextListener, SearchView.OnCloseListener  {
        SearchView searchView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.searchview_filter);

            ListView listview1 = (ListView) findViewById(R.id.list1);

            defaultAdapter = new ItemAdapter(this, R.layout.list_item, array_data);
            listview1.setAdapter(defaultAdapter);

            searchView = (SearchView) findViewById(R.id.search_view);
            searchView.setIconifiedByDefault(false);

            searchView.setOnQueryTextListener(this);
            searchView.setOnCloseListener(this);

            mDbHelper = new DBHelper(this);
            mDbHelper.open();

            //Clear all names
            mDbHelper.deleteAllNames();

            // Create the list of names which will be displayed on search
            for (Item name : array_data) {
                mDbHelper.createList(name);
            }
        }
        private void displayResults(String query) {

            Cursor cursor = mDbHelper.searchByInputText((query != null ? query : "@@@@"));

            if (cursor != null) {

                String[] from = new String[]{DBHelper.COLUMN_NAME};
                int[] to = new int[]{R.id.search_view};

                SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.searchview_filter, cursor, from, to);
                listView1.setAdapter(cursorAdapter);

                //listview Click listener
               listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                       Cursor cursor = (Cursor) listView1.getItemAtPosition(position);

                       String selectedName = cursor.getString(cursor.getColumnIndexOrThrow("name"));
                       Toast.makeText(getApplication(), selectedName,Toast.LENGTH_SHORT).show();

                       listView1.setAdapter(defaultAdapter);

                       for (int pos = 0; pos < array_data.size(); pos++) {
                           if (array_data.get(pos).equals(selectedName)) {
                               position = pos;
                               break;
                           }
                       }
                       Handler handler = new Handler();
                       final int finalPosition = position;
                       handler.post(new Runnable() {
                           @Override
                           public void run() {

                               listView1.setSelection(finalPosition);
                           }
                       });
                       searchView.setQuery("", true);
                   }
               });
            }
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();

            if (mDbHelper  != null) {
                mDbHelper.close();
            }
        }
        @Override
        public boolean onClose() {
            listview.setAdapter(defaultAdapter);
            return false;
        }
        @Override
        public boolean onQueryTextSubmit(String query) {
            displayResults(query + "*");
            return false;
        }
        @Override
        public boolean onQueryTextChange(String newText) {
            if (!newText.isEmpty()){
                displayResults(newText + "*");
            } else {
                listview.setAdapter(defaultAdapter);
            }
            return false;
        }
    }
    this is my view stock fragment

    public class ViewStock extends Fragment {

        public ViewStock() {
            // Required empty public constructor
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View rootview = inflater.inflate(R.layout.fragment_view_stock, container, false);
            MainActivity act = (MainActivity) this.getActivity();

            act.listview = (ListView)rootview.findViewById(R.id.list);
            act.array_data = new ArrayList<Item>();
            // Context mCtx = getActivity().getApplicationContext();

         //   ItemAdapter adapter = new ItemAdapter(getActivity(), R.layout.list_item, act.arrayList);
           // listview.setAdapter(adapter);
            act.mDbHelper = new DBHelper(getActivity());
            act.db=new DBHandler(getActivity());
            ArrayList<Item> item_array_from_db = act.db.Get_items();
            for (int i = 0; i < item_array_from_db.size(); i++) {

                int idno = item_array_from_db.get(i).getID();
                String name = item_array_from_db.get(i).getItem_name();
                String desc = item_array_from_db.get(i).getItem_desc();
                String qty = item_array_from_db.get(i).getItem_qty();
                Item cnt = new Item();
                cnt.setID(idno);
                cnt.setItem_name(name);
                cnt.setItem_desc(desc);
                cnt.setItem_qty(qty);

                act.array_data.add(cnt);
            }
            act.mDbHelper.close();
            ArrayAdapter<Item> adapter = new ItemAdapter(getActivity(), R.layout.list_item,
                    act.array_data);
            act.listview.setAdapter(adapter);
            adapter.notifyDataSetChanged();

            return rootview;
        }
    }
    this is my database

    public class DBHandler extends SQLiteOpenHelper {

        private static final int DATABASE_VERSION = 1;
        private static final String DATABASE_NAME = "stock";
        private static final String TABLE_ITEMS = "items";

        private static final String KEY_ID = "id";
        private static final String KEY_NAME = "itemname";
        private static final String KEY_DESC = "itemdesc";
        private static final String KEY_QTY = "itemqty";
        private final ArrayList<Item> array_list = new ArrayList<Item>();


        public DBHandler(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            String CREATE_ITEMS_TABLE = "CREATE TABLE " + TABLE_ITEMS + "("
                    + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                    + KEY_DESC + " TEXT," + KEY_QTY + " INTEGER" + ")";
            db.execSQL(CREATE_ITEMS_TABLE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

            db.execSQL("DROP TABLE IF EXISTS " + TABLE_ITEMS);
            onCreate(db);
        }

    public ArrayList<Item> Get_items() {
            try {
            array_list.clear();

            String selectQuery = "SELECT  * FROM " + TABLE_ITEMS;

            SQLiteDatabase db = this.getWritableDatabase();
            Cursor cursor = db.rawQuery(selectQuery, null);

            if (cursor.moveToFirst()) {
            do {
            Item item = new Item();
            item.setID(Integer.parseInt(cursor.getString(0)));
            item.setItem_name(cursor.getString(1));
            item.setItem_desc(cursor.getString(2));
            item.setItem_qty(cursor.getString(3));

            array_list.add(item);
            } while (cursor.moveToNext());
            }
            cursor.close();
            db.close();
            return array_list;
            } catch (Exception e) {
            // TODO: handle exception
            Log.e("all_contact", "" + e);
            }
            return array_list;
            }
    public void Add_Item(Item item) {
            SQLiteDatabase mDbHelper = this.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(KEY_NAME, item.getItem_name());
            values.put(KEY_DESC, item.getItem_desc());
            values.put(KEY_QTY, item.getItem_qty());

            mDbHelper.insert(TABLE_ITEMS, null, values);
            mDbHelper.close();
            }
            Item Get_Item(int id) {
            SQLiteDatabase mDbHelper = this.getReadableDatabase();

            Cursor cursor = mDbHelper.query(TABLE_ITEMS, new String[]{KEY_ID,
            KEY_NAME, KEY_DESC, KEY_QTY}, KEY_ID + "=?",
            new String[]{String.valueOf(id)}, null, null, null, null);
            if (cursor != null)
            cursor.moveToFirst();

            Item item = new Item(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), cursor.getString(2), cursor.getString(3));

            cursor.close();
            mDbHelper.close();

            return item;
            }
        }
    }

    this is my virtual table for search
    public class DBHelper {

        public static final String COLUMN_NAME = "itemname";
        private static final String TAG = "stock";
        private DBHelper myDbHelper;
        private SQLiteDatabase myDb;

        private static final String DATABASE_NAME = "Data";
        private static final String FTS_VIRTUAL_TABLE = "Info";
        private static final int DATABASE_VERSION = 1;

        //Create a Virtual Table for fast searches
        private static final String DATABASE_CREATE =
                "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE + " USING fts3("
                        + COLUMN_NAME
                        + " UNIQUE (" + COLUMN_NAME + "));";


        private final Context context;


            public DBHelper(Context ctx) {
                this.context = ctx;
            }
        public DBHelper open() throws SQLException {
            myDbHelper = new DBHelper(context);
          //  myDbHelper = getWritableDatabase();
            return this;
        }
            public void close() {
                if (myDbHelper != null) {
                    myDbHelper.close();
                }
            }


            public long createList(Item item) {

                ContentValues initialValues = new ContentValues();

                initialValues.put(COLUMN_NAME,item.getItem_name());

                return myDb.insert(FTS_VIRTUAL_TABLE, null, initialValues);

            }


            public Cursor searchByInputText(String inputText) throws SQLException {

                String query = "SELECT docid as _id," +
                        COLUMN_NAME +  " from " + FTS_VIRTUAL_TABLE +
                        " where " + COLUMN_NAME + " MATCH '" + inputText + "';";

                Cursor mCursor = myDb.rawQuery(query,null);

                if (mCursor != null) {
                    mCursor.moveToFirst();
                }
                return mCursor;

            }
        public boolean deleteAllNames() {

            int doneDelete = myDb.delete(FTS_VIRTUAL_TABLE, null, null);
            return doneDelete > 0;

        }
    }

    this is search view layout
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
        xmlns:tools="http://ift.tt/LrGmb4"
        xmlns:android="http://ift.tt/nIICcg"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

            <LinearLayout xmlns:android="http://ift.tt/nIICcg"
                android:orientation="horizontal" android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:baselineAligned="false"
                android:id="@+id/header"
                android:weightSum="1">
                    <TextView
                        android:id="@+id/lbl_item_name"
                        android:layout_width="100dp"
                        android:layout_height="wrap_content"
                        android:text="@string/txt_item_name"
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:textStyle="bold"
                        android:layout_weight="0.33" />

                    <TextView
                        android:id="@+id/lbl_item_desc"
                        android:layout_width="100dp"
                        android:layout_height="wrap_content"
                        android:text="@string/txt_item_desc"
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:textStyle="bold"
                        android:layout_weight="0.33" />
                    <TextView
                        android:id="@+id/lbl_item_qty"
                        android:layout_width="100dp"
                        android:layout_height="match_parent"
                        android:text="@string/txt_item_qty"
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:textStyle="bold"
                        android:layout_weight="0.33" />

    </LinearLayout>

            <ListView
                android:id="@+id/list1"
                android:background="@android:color/background_light"
                android:layout_width="match_parent"
                android:layout_height="531dp"
                android:layout_gravity="center_horizontal|bottom" />

    </FrameLayout>

    this is menu item layout

    <menu xmlns:android="http://ift.tt/nIICcg"
        xmlns:tools="http://ift.tt/LrGmb4"
        xmlns:app="http://ift.tt/GEGVYd"
        tools:context=".MainActivity">
        <item android:id="@+id/action_settings" android:title="@string/action_settings"
          />
        <item android:id="@+id/search_view"
            android:title="@string/action_search"
            android:icon="@drawable/ic_action_search"
            app:showAsAction="always"
            app:actionViewClass="android.support.v7.widget.SearchView"/>
    </menu>

Aucun commentaire:

Enregistrer un commentaire