0

Is it possible to create something like a NumberPicker Widget in android but populate it with a series of strings pulled from an SQLite database?

If there's only one entry, then the spinner would have one string, if there is a hundred, then there would be a hundred entries. There cannot be less than one entry by design, as in, the activity can't be entered without at least one entry. There is no hardset upper limit, but the data will be populated by date and it is VERY unlikely that this data set would ever exceed a thousand entries due to the nature of how the data is created.

What I'm trying to do is show data saved in an SQLite database, the name of each dataset would be displayed in the NumberPicker, then the user could quickly scroll through the data. The data is then going to be be displayed in a Bar Chart (MPandroidcharts library), as they scroll past the dataset in the NumberPicker. At least, that's the goal.

I've managed the SQLite database, and I've got the charts working for single datasets, I just can't figure out how to get the data selection side working.

Diesel
  • 519
  • 1
  • 6
  • 24
  • I would image a "DataPicker" widget as you have described it would be a nightmare to use if you have more than lets say 50 entries-- not to mention the memory requirements for anything close to a 1000 entries. Consider using a `RecyclerView` (possibly in combination with an `EditText` view to help search through entries). – Barns Oct 27 '17 at 23:47
  • @diesel Have you thought about an Array or a HashMap populate a component that holds data and scroll through kind of a mini listview with the data numbers coming from a DB table – Vector Oct 28 '17 at 03:19
  • @Barns52, I've been looking into the RecylcerView in parallel with my current plan. The way I was planning on doing this seemed simpler on my initial sketches, but it's looking like an ExpandableListView with RecyclerView might be best. Each of the entries will be chronological, so I don't think a search feature is needed (yet). Definitely a possibility in a future upgrade though – Diesel Oct 28 '17 at 18:11
  • @Grendel I thought about an Array, but since the upper limit is an unknown I thought that it may get memory intensive the more users populate the database. I've also looked into HashMaps, but i'm still trying to wrap my head around how to use them. (still very new to java) – Diesel Oct 28 '17 at 18:16
  • @Diesel :: If you are going to make the list sorted chronologically then consider adding a field in your DB for a timestamp (I usually use Calendar cal = Calendar.getInstance(); return cal.getTimeInMillis();). Then you can use a SortedMap with the TimeInMillis as the maps Key. – Barns Oct 28 '17 at 19:38

1 Answers1

1

Try this code this is just a List Activity that is backed by a Recycler Adapter the XML for the List Activity is included and the Card Layout XML file

   public class ListActivity extends AppCompatActivity {

   DBHelper helper;
  static List<DBModel>dbList;
   RecyclerView mRecyclerView;
   private static RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);

    addListenerOnButtonAdd();
    TextView tvNoData = (TextView)findViewById(R.id.tvNoData);

    setTitle("");// This sets the title of the toolbar
    Toolbar topToolBar = (Toolbar)findViewById(R.id.toolbar);
    setSupportActionBar(topToolBar);
    //topToolBar.setLogo(R.drawable.keyss);// See Notes in MainActivity

    setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


    helper = new DBHelper(this);
    dbList = new ArrayList<>();
    dbList = helper.getDataFromDB();

    mRecyclerView = (RecyclerView)findViewById(R.id.recycleview);
    mRecyclerView.setHasFixedSize(true);

    // use a linear layout manager
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    // Code below defines the adapter
    mAdapter = new RecyclerAdapter(this,dbList);
    mRecyclerView.setAdapter(mAdapter);

    int sz = dbList.size();
    if(sz == 0){
        tvNoData.setVisibility(View.VISIBLE);
        tvNoData.setText("No Data");
    }
  }

  // This method is called from DetailsActivity and notifies Recycler View 
  that the DB was changed

   of DB and Recycler View
   public static void removeListRow(int position) {
    dbList.remove(position);
    mAdapter.notifyItemRemoved(position);
    mAdapter.notifyItemRangeChanged(position, dbList.size());
   }

    /* this BUTTON is on the ToolBar click to ADD new record */
    private void addListenerOnButtonAdd() {
    // Navigate to DetailsActivity to ADD new DATA
    Toolbar tb = (Toolbar) findViewById( R.id.toolbar );
    setSupportActionBar( tb );

    tb.findViewById( R.id.btnAdd ).setOnClickListener( new 
    View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intentSP = new Intent(ListActivity.this, 
   DetailsActivity.class );
            Bundle extras = new Bundle();
            extras.putString("FROM_LIST_ACTIVITY","true" );
            intentSP.putExtras(extras);
            startActivity( intentSP );
        }
    } );
 }

public void onBackPressed(){
    Intent intent = new Intent( ListActivity.this, MainActivity.class );
    startActivity( intent );
 }
 }


   <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/activity_list"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
  android:background="@color/color_lightGray"
   android:orientation="vertical"
   tools:context="com.searchdb.ListActivity">

    <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:minHeight="?attr/actionBarSize"
    android:background="@color/color_darkGray"
    android:layout_width="match_parent"
    android:layout_height="64dp">

    <ImageView
        android:id="@+id/imageTB"
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:paddingBottom="2dp"
        android:paddingLeft="2dp"
        android:paddingRight="2dp"
        android:paddingTop="4dp"
        android:src="@drawable/keyss" />

    <TextView
        android:text="@string/list_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/toolbar"
        android:layout_alignParentStart="true"
        android:layout_marginStart="30dp"
        android:layout_marginBottom="20dp"
        android:id="@+id/tvLA"
        android:textStyle="bold"
        android:textColor="@color/color_White"
        android:textSize="22sp" />

    <Button
        android:text="@string/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnAdd"
        android:layout_marginLeft="100dp"
        android:textSize="18sp"
        android:textStyle="bold"
        android:focusable="false"
        android:textColor="@color/color_White"
        android:background="@color/color_Transparent"/>

  </android.support.v7.widget.Toolbar>

  <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycleview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:text="TextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tvNoData"
        android:gravity="center"
        android:layout_marginTop="240dp"
        android:visibility="invisible"
        android:textAllCaps="true"
        android:textStyle="bold"
        android:textSize="30sp"
        android:textColor="@color/color_Red" />
 </LinearLayout>

  </LinearLayout>

  public class RecyclerAdapter extends 
  RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

  static List<DBModel> dbList;
  static private Context context;
   int sz;

   RecyclerAdapter(Context context, List<DBModel> dbList) {

    RecyclerAdapter.dbList = new ArrayList<>();
    RecyclerAdapter.context = context;
    RecyclerAdapter.dbList = dbList;
 }

 @Override
 public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int 
 viewType) {

    View itemLayoutView = 
 LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row, null);
    // create ViewHolder
    ViewHolder viewHolder = new ViewHolder(itemLayoutView);

    return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerAdapter.ViewHolder holder, int 
 position) {
    holder.rowid.setText(String.valueOf(dbList.get(position).getRowid()));
    holder.station.setText(dbList.get(position).getStation_Name());
    System.out.println("RecyclerAdapter BindViewHolder FIRST position 
 "+position);
}

 @Override
 public int getItemCount() {
    return dbList.size();
 }

 public class ViewHolder extends RecyclerView.ViewHolder implements 
 View.OnClickListener {

    public TextView station, rowid;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);

        rowid = (TextView) itemLayoutView.findViewById(R.id.rvROWID);
        station = (TextView) itemLayoutView.findViewById(R.id.rvSTATION);
        // Attach a click listener to the entire row view
        itemLayoutView.setOnClickListener(this);

    }

   @Override 
    public void onClick(View v) {

       Intent intentN = new Intent(context, DetailsActivity.class);
       Bundle extras = new Bundle();
       extras.putInt("POSITION", getAdapterPosition());
       extras.putString("FROM_LIST_ACTIVITY", "false");
       intentN.putExtras(extras);
       context.startActivity(intentN);
   }
   }
   }

  <?xml version="1.0" encoding="utf-8"?>
 <android.support.v7.widget.CardView 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:card_view="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_margin="5dp"
  android:orientation="horizontal"
  card_view:cardCornerRadius="5dp"
  card_view:cardUseCompatPadding="true">

   <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/color_White">

    <TextView
        android:id="@+id/rvROWID"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="left|center_vertical"
        android:padding="10dp"
        android:textAlignment="center"
        android:text="Position ID"
        android:textColor="@color/color_Black"
        android:layout_marginLeft="10dp"
        android:textStyle="bold"
        android:textSize="16sp"/>

    <TextView
        android:id="@+id/rvSTATION"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:padding="10dp"
        android:gravity="right|center_vertical"
        android:text="Station"
        android:layout_marginLeft="10dp"
        android:textStyle="bold"
        android:textSize="16sp"
        android:textColor="@color/color_Black" />

   </RelativeLayout>

  </android.support.v7.widget.CardView>
Vector
  • 3,066
  • 5
  • 27
  • 54
  • This is looking like it might be what I should be doing, but I'm having some trouble. There's a fair bit in here that I'm not quite understanding and I think our databases are set up very differently so adapting this is more than a little difficult. Could you include a bit more information explaining or perhaps your db model? – Diesel Nov 03 '17 at 15:46
  • if it would be more helpful, I could also post my full project I'm working on – Diesel Nov 03 '17 at 15:48
  • @Diesel My DB Model class is rather generic it has just getter and setter for the data entry and data read fields as far as the DB tables very plain – Vector Nov 03 '17 at 22:11
  • Thanks! I found the issue I was having with this, I forgot about adding in the gradle dependencies for the recyclerView. I'm making some decent progress on this now thanks! I may ping you later if I run into more troubles – Diesel Nov 04 '17 at 17:08