title: How can I Reuse Methods for ListViews?
body: <p>I have several methods in the ListAC ListActivity that I want to reuse and would like to put in separate classes (if possible??). I will be having dozens of ListView Activities (ListActivities ie: ListAD, ListTCDS, listSFAR, etc., etc.) that will call on these methods that are exactly the same in this activity but the only changes in the 'Cursor databaseCursor' (ie.  The Table name for each ListActivity).  I plan on putting these Classes and related into their own packages w/n the application (ie: com.myCompany.myApp.AC) Also, w/n these Activities there needs to be multiple coursers for the query's 'ORDER BY' (ie: " ...'list' ASC | DESC", "...'title' ASC | DESC", etc.).  B4 the cursors are called, I have the method for checking the ExternalStorageState too. I was given the class, StorageStateChecker (see below) from LeffelMania (THNX!) for reusing ExternalStorageState and I would like to use that still - even though its not implemented in the code below. I decided to step backwards* to rethink this (I screwed myself up - LOL) and to make it easier for you guys and gals to read thru the code.</p>
  
  <p>As you can see, this will cause a major amount of unnecessary redundancy and byte-space on the device. I need to squeeze every bit of space possible on the devices because this app will be the only sole purpose to the users of these devices (if the project moves forward - LOL).</p>
  
  <p>So, I need a way to cut it down by calling on these methods thru separate classes, if at all possible with the way I wrote these methods and my adapters. Any help w/suggestions, methods, how too's, and code will be very appreciative and helpful to me learning Java/Android.  Thnx!!</p>
  
  <p>*This post is related and is continuing from <a href="https://stackoverflow.com/q/5889385/600984">HERE</a> and <a href="https://stackoverflow.com/q/5905587/600984">HERE</a>.</p>
  
  <p>UPDATE:  The completed class is below in the REVISED block.  Thnx to all the helped me and now I am getting a better understanding of classes &amp; method usage.</p>
  
  <p>ListAC Activity:</p>
  
  <pre><code>public class ListAC extends ListActivity {
  /**
   * -- Called when the activity is first created
   * ===================================================================
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      requestWindowFeature(Window.FEATURE_NO_TITLE);
      setContentView(R.layout.list_view2);
  
      activityTitle = (TextView) findViewById(R.id.titleBarTitle);
      activityTitle.setText("ADVISORY CIRCULATORS");
  
      storageState();
      searchList();
      nextActivity(); 
  }
  
  /**
   * -- Check to See if the SD Card is Mounted &amp; Loads Default List Order
   * ======================================================================
   **/
  private void storageState() {
      if (android.os.Environment.getExternalStorageState().equals(
              android.os.Environment.MEDIA_MOUNTED)) {
  
          orderASC_Label();// Loads the list
  
      } else if (android.os.Environment.getExternalStorageState().equals(
              android.os.Environment.MEDIA_UNMOUNTED)) {
          Alerts.sdCardMissing(this);
      }
  }
  
  /**
   * -- Default List Order (Ascending)
   * =====================================================================
   **/
  public void orderASC_Label() {
      Cursor databaseCursor = db.rawQuery(
              "SELECT * FROM AC_list ORDER BY `label` ASC", null);
  
      Adapter_AC databaseListAdapter = new Adapter_AC(this,
              R.layout.list_item, databaseCursor, new String[] { "label",
                      "title", "description", "gotoURL" }, new int[] {
                      R.id.label, R.id.listTitle, R.id.caption, R.id.dummy });
  
      databaseListAdapter.notifyDataSetChanged();
      this.setListAdapter(databaseListAdapter);
  }
  
  /**
   * -- Starts the Next Activity
   * =====================================================================
   **/
  public void nextActivity() {
  
      final ListView lv = getListView();
      lv.setTextFilterEnabled(true);
      lv.setClickable(true);
  
      lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  
          @Override
          public void onItemClick(AdapterView&lt;?&gt; a, View v, int pos, long id) {
  
              String url = "";
              TextView tv = (TextView) v.findViewById(R.id.dummy);
              url = (String) tv.getTag();
  
              String lbl = "";
              TextView tv2 = (TextView) v.findViewById(R.id.label);
              lbl = (String) tv2.getTag();
  
              Intent i = new Intent(List_AC.this, DocView.class);
              i.putExtra("url", url);
              i.putExtra("label", lbl);
              startActivity(i);
          }
      });
  }
  
  /**
   * -- Dispatched when the Menu-Key is presses
   * =====================================================================
   **/
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
      if (keyCode == KeyEvent.KEYCODE_MENU) {
          Intent i = new Intent(List_AC.this, DashBoard.class);
          startActivity(i);
      }
      return super.onKeyDown(keyCode, event);
  }
  
  /**
   * -- Local Variables
   * =====================================================================
   **/
  protected TextView activityTitle;
  boolean mExternalStorageAvailable = false;
  boolean mExternalStorageWriteable = false;
  String extStorageDirectory = Environment.getExternalStorageDirectory()
          .toString();
  File dbfile = new File(extStorageDirectory
          + "/XXX/xxx/dB/xxx.db");
  SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
  
  /** ======================= END ==================================== **/
  }
  </code></pre>
  
  <p>My Adapter (AdaperAC):</p>
  
  <pre><code>public class AdapterAC extends SimpleCursorAdapter {
  
  
  static Cursor dataCursor;
  private LayoutInflater mInflater;
  
  public Adapter_AC(Context context, int layout, Cursor dataCursor,
          String[] from, int[] to) {
      super(context, layout, dataCursor, from, to);
      this.dataCursor = dataCursor;
      mInflater = LayoutInflater.from(context);
  }
  
  public View getView(int position, View convertView, ViewGroup parent) {
  
      ViewHolder holder;
  
      if (convertView == null) {
          convertView = mInflater.inflate(R.layout.list_item, null);
  
          holder = new ViewHolder();
          holder.text1 = (TextView) convertView.findViewById(R.id.label);
          holder.text2 = (TextView) convertView.findViewById(R.id.listTitle);
          holder.text3 = (TextView) convertView.findViewById(R.id.caption);
          holder.text4 = (TextView) convertView.findViewById(R.id.dummy);
  
          holder.text4.setVisibility(View.GONE);
  
          convertView.setTag(holder);
  
      } else {
          holder = (ViewHolder) convertView.getTag();
      }
  
      dataCursor.moveToPosition(position);
  
      int label_index = dataCursor.getColumnIndex("label");
      String label = dataCursor.getString(label_index);
  
      int title_index = dataCursor.getColumnIndex("title");
      String title = dataCursor.getString(title_index);
  
      int description_index = dataCursor.getColumnIndex("description");
      String description = dataCursor.getString(description_index);
  
      int goto_index = dataCursor.getColumnIndex("gotoURL");
      String gotoURL = dataCursor.getString(goto_index);
  
      holder.text1.setText(label);
      holder.text1.setTag(label);
      holder.text2.setText(title);
      holder.text3.setText(description);
      //holder.text4.setText(gotoURL);
      holder.text4.setTag(gotoURL);
  
      return convertView;
  }
  
  static class ViewHolder {
      TextView text1;
      TextView text2;
      TextView text3;
      TextView text4;
  }
  
  }
  </code></pre>
  
  <p>REVISED to:</p>
  
  <pre><code>public class QueryDisplay extends ListActivity {
  
  protected TextView activityTitle;
  
  boolean mExternalStorageAvailable = false;
  boolean mExternalStorageWriteable = false;
  
  String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
  File dbfile = new File(extStorageDirectory + "/myComp/myApp/dB/myApp.db");
  SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
  
  private static final String QUERY_KEY = "QUERY_KEY";
  
  /**
   * -- Called when the activity is first created
   * ===================================================================
   */
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.list_view2);
  
      Bundle extras = getIntent().getExtras();
  
      String q = null;
      if (extras != null) {
  
          q = extras.getString(QUERY_KEY);
          Log.i("tag", "getting extras" + extras);
      }
  
      reloadQuery(q);
  }
  
  public void reloadQuery(String q) {
  
      Log.i("tag", "reloadQuery");
  
      if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
  
          Cursor c = db.rawQuery(q, null);
          setListAdapter(new QueryAdapter(this, c));
          db.close();
  
      }else {
          Alerts.sdCardMissing(this);
      }
  }
  
  private class QueryAdapter extends CursorAdapter {
  
      public QueryAdapter(Context context, Cursor c) {
          super(context, c);
          LayoutInflater.from(context);
      }
  
      @Override
      public void bindView(View v, Context context, Cursor c) {
  
              int tvLabel = c.getColumnIndexOrThrow("label");
              String label = c.getString(tvLabel);
              TextView labelTxt = (TextView) v.findViewById(R.id.label);
  
              if (labelTxt != null) {
                  labelTxt.setText("(" + label + ")");
              }
  
              int tvTitle = c.getColumnIndexOrThrow("title");
              String title = c.getString(tvTitle);
              TextView titleTxt = (TextView) v.findViewById(R.id.listTitle);
  
              if (titleTxt != null) {
                  titleTxt.setText(title);
              }
  
              int tvDescription = c.getColumnIndexOrThrow("description");
              String description = c.getString(tvDescription);
              TextView descriptionTxt = (TextView) v.findViewById(R.id.caption);
  
              if (descriptionTxt != null) {
                  descriptionTxt.setText(description);
              }
  
              int tvGoto= c.getColumnIndexOrThrow("gotoURL");
              String gotoURL = c.getString(tvGoto);
              TextView gotoTxt = (TextView) v.findViewById(R.id.dummy);
  
              if (gotoTxt != null) {
                  gotoTxt.setText(gotoURL);
              }
  
              gotoTxt.setVisibility(View.GONE);
              v.setTag(tvGoto);
      }
  
      @Override
      public View newView(Context context, Cursor c, ViewGroup parent) {
  
          final View v = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
          return v;
      }
  }
  }
  </code></pre>
  
  <p>...and how to call &amp; inject the query:</p>
  
  <pre><code>OnClickListener myClickListener = new OnClickListener() {
      @Override
      public void onClick(View v) {
          if (v == myBtn) {
  
              String queryKey = "SELECT * FROM a_tablet ORDER BY `column` ASC";
              Intent i = new Intent(CurrentClass.this,QueryDisplay.class);
              i.putExtra("QUERY_KEY", queryKey);
              startActivity(i);
              }
  </code></pre>