1

I have an activity where I want it to display results from a database using ListView. The table has three columns: word, description, and category. On the activity page, I have a list of categories being read from an array. I want to set it up so that if you click on an item on the list (for example Cat1), the results returned from the cursor will be all words/descriptions with the category Cat1 in the DB. Currently I simply have a Toast with that category's name appear when clicked.

As it is right now, the activity does not run properly. I have read around on the web, and am not sure how to proceed. Here is the code I have so far. If anyone can help me, I would really appreciate it.

public class Categories extends ListActivity { DataBaseHelper db = new DataBaseHelper(this); private SQLiteDatabase data; int position;

private ListView list;
private String[] categories = {
    "C1", "C2", "C3", "C4",
    "C5", "C6", "C7", "C8",
    "C9", "C10", "C11", "C12"
};

@Override
public void onCreate(Bundle icicle){
    super.onCreate(icicle);
    setContentView(R.layout.cat_list);

    list = (ListView)findViewById(R.id.cat_listing);
    list.setAdapter(new ArrayAdapter<String>(this,
        R.layout.categories, categories));
    list.setTextFilterEnabled(true);

    Cursor cursor = data.rawQuery("SELECT term, desc FROM words WHERE cat = '" + categories[position] + "'", null);
    startManagingCursor(cursor);

    String columns[] = new String[] { "term", "desc" };
    int[] to = new int[] { R.id.cat_term, R.id.cat_desc };

    SimpleCursorAdapter myAdapter = new SimpleCursorAdapter(this, R.layout.cat_result, cursor, columns, to);
    this.setListAdapter(myAdapter);

    list.setOnItemClickListener(new OnItemClickListener(){

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id){
            CharSequence text = categories[position];
            Toast toast = Toast.makeText(getApplicationContext(),
                    text, Toast.LENGTH_SHORT);
            toast.show();
        }
    });
}

}

2 Answers 2

4

I have a similar function in my app. You will need to create a XML file to define the layout for the list and call them in your java code.

Here is the example XML:

LIST:

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical"  >
    <ListView 
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"   >
    </ListView>
    <TextView
        android:id="@+id/android:empty"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="@string/no_projects"
        android:padding="10dp"
        android:textSize="16sp"
        android:textStyle="bold"    >
    </TextView>
</LinearLayout>

This is the custom layout XML. I call it list_rows:

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical"  >
    <TextView
        android:id="@+id/text1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </TextView>
    <TextView
        android:id="@+id/text2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </TextView>
    <TextView
        android:id="@+id/text3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </TextView>
</LinearLayout>

And this is the JAVA code:

String[] fields = new String[]  {   db.TABLE_PRJ_NAME, db.TABLE_PRJ_TYPE, db.TABLE_PRJ_DESC };
    int[] views = new int[] {   /*android.R.id.text1*/ R.id.text1, R.id.text2, R.id.text3   };

    c = db.getAllProjects();
    startManagingCursor(c);

    // Set the ListView
    SimpleCursorAdapter prjName = new SimpleCursorAdapter(
            this,
            R.layout.project_list_rows,
            //android.R.layout.simple_list_item_1,
            c, fields, views);
    setListAdapter(prjName);

The onListItemClickListener

// This section of code is for handling the Click Event of the Projects List
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    Cursor o = (Cursor) this.getListAdapter().getItem(position);
    String projectName = o.getString(1);

    Intent showProjectDetails = new Intent(this, ProjectDetails.class);
    Bundle bundle = new Bundle();

    bundle.putString("sendProjectName", projectName);

    showProjectDetails.putExtras(bundle);
    startActivity(showProjectDetails);
}

What the new part of the code is doing is just sending the selected item to another activity through an intent. Then in the new activity, I am querying the DB using the selected item name from the bundle and displaying the result.

Do ask if you need further explanation.

Sign up to request clarification or add additional context in comments.

2 Comments

Siddharth, That is what I already have, if you looked at my code. I am having trouble with having this code run without errors while doing what I need done. Can you post the entire source instead of an excerpt? Do you even use OnItemClick? Thanks...
I'm really sorry but I'm having trouble here. I understand what is involved in preparing the Cursor and creating a SimpleCursorAdapter. However, I don't want a new Activity. I want it so if someone clicks on an item in the list, it will query the DB and return a list of all words in the category that was clicked on. I have tried the code you posted, and I end up having to force quit when opening that Activity (I can't even get to the category list to test). The code I have posted above works if you remove the SimpleCursorAdapter declaration and the setListAdapter call on the next line.
0

I am making a very similar program. I'm having trouble with it as its my first program for android/java. What help I have got is from web and my step father who use to teach java.

When helping me setup a database he explained to setup my tables so categories is paired with items under it. So you would have a table for your categories including the title you will display for that category as well as your primary key. Then you need a table for the next level down from category, say title. This would include a text for title and primary key. Next you need to make another table to pair them up. A title key, category key, and primary key.

From there you will need to tell java to pair them up based off that last table.

I'm a noob so sorry I couldn't give more/better info. But anything I find on this issue I'll post here and good luck.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.