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