Chintan Soni Chintan Soni - 6 months ago 16
Android Question

get clicked item from listview

I've got a problem. Before modification in my XML file, my listview was able to work perfectly. But now, after some modifications in xml, its not working properly.
My listview is custom. So, i've created separate xml to render every single row in the listview.

My single row.xml code:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:id="@+id/relativeLayoutSingleRowManageAddictions"
android:layout_height="40dp"
android:background="@drawable/box_midbg" >

<TextView
android:id="@+id/textViewSingleRowManageAddictions"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="17dp"
android:text="TextView"
android:textSize="20dp"
android:textColor="#ffffff" />

<ImageView
android:id="@+id/imageViewSingleRowManageAddictions"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="18dp"
android:src="@drawable/listing_arrow" />

</RelativeLayout>


My main.xml code where listview resides:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/main_bg_edited" >

<RelativeLayout
android:id="@+id/relativeLayout1"
style="@style/top_bar_style" >

<ImageView
android:id="@+id/imageViewMAnageAddictionsBack"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:src="@drawable/back_arrow"
android:clickable="true" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/header_style"
android:text="Manage Addictions" />

<ImageView
android:id="@+id/imageViewManageAddictionsAdd"
android:layout_width="25dp"
android:layout_height="20dp"
android:layout_marginRight="3dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/plus_nav"
android:clickable="true" />

</RelativeLayout>

<ListView
android:id="@+id/listViewManageAddictions"
android:layout_width="290dp"
android:layout_height="fill_parent"
android:layout_below="@+id/relativeLayout1"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
android:layout_marginTop="12dp"
android:divider="@android:color/transparent"
android:dividerHeight="2dp" />

</RelativeLayout>


And my java code for it:

package com.addictioncounterapp;

import java.util.ArrayList;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class ManageAddictionList extends Activity {
ImageView iv_manage_addictions_back, iv_manage_addictions_add;
ListView listview;
ArrayList < String > arraylist_manage_addiction;
ArrayAdapter < String > arrayadapter_manage_addiction;
SQLiteDatabase database;

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

loaddatabase();

iv_manage_addictions_back = (ImageView) findViewById(R.id.imageViewMAnageAddictionsBack);
iv_manage_addictions_back.setClickable(true);
iv_manage_addictions_back.setOnClickListener(new OnClickListener() {@Override
public void onClick(View v) {
startActivity(new Intent(ManageAddictionList.this, Settings.class));
}
});

iv_manage_addictions_add = (ImageView) findViewById(R.id.imageViewManageAddictionsAdd);
iv_manage_addictions_add.setClickable(true);
iv_manage_addictions_add.setOnClickListener(new OnClickListener() {@Override
public void onClick(View v) {
Intent intent = new Intent(ManageAddictionList.this, MainActivity.class);
intent.putExtra("name", "");
intent.putExtra("unit", "");
intent.putExtra("attribute", "");
intent.putExtra("limit", "");
intent.putExtra("operation", "Add Addiction");
startActivity(intent);
}
});


arraylist_manage_addiction = new ArrayList < String > ();
manageList();
listview = (ListView) findViewById(R.id.listViewManageAddictions);

if (arraylist_manage_addiction.isEmpty()) Toast.makeText(getBaseContext(), "No Addictions found to manage. Click on 'add' button to create new Addiction.", Toast.LENGTH_SHORT)
.show();
else listview.setAdapter(arrayadapter_manage_addiction);

listview.setOnItemClickListener(new OnItemClickListener() {@Override
public void onItemClick(AdapterView <? > arg0, View arg1, int arg2, long arg3) {
String name = null, attribute = null, unit = null, limit = null;

View parentView = (View) arg0.getParent();
name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions))
.getText() + "";

Toast.makeText(getBaseContext(), name, Toast.LENGTH_SHORT)
.show();

int cat_id = 0;

//--------Fetching cat_id through name from the list--------

Cursor cursor;

cursor = database.query("category", new String[] {
"cat_id"
}, new String("cat_name=?"), new String[] {
name
}, null, null, null);

if (cursor.getCount() > 0) {
while (cursor.moveToNext())
cat_id = cursor.getInt(0);
cursor.close();
}

//--------Fetching unit, attribute, limit through cat_id from the list--------

cursor = database.query("category_attribute", new String[] {
"cat_attribute_name", "cat_attribute_unit", "cat_limit"
}, new String("cat_id=?"), new String[] {
cat_id + ""
}, null, null, null);

if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
attribute = cursor.getString(0);
unit = cursor.getString(1);
limit = cursor.getString(2);
}
cursor.close();
}

Intent intent = new Intent(ManageAddictionList.this, MainActivity.class);
intent.putExtra("name", name);
intent.putExtra("unit", unit);
intent.putExtra("attribute", attribute);
intent.putExtra("limit", limit);
intent.putExtra("cat_id", cat_id);
intent.putExtra("operation", "Edit Addiction");
startActivity(intent);
}
});
}

private void loaddatabase() {
database = openOrCreateDatabase("AddictionCounter.db", SQLiteDatabase.OPEN_READONLY, null);
}

private void manageList() {
String[] columns = {
"cat_name"
};
Cursor cursor;

cursor = database.query("category", columns, null, null, null, null, null);

if (cursor.getCount() > 0) {
while (cursor.moveToNext())
arraylist_manage_addiction.add(cursor.getString(0));
cursor.close();
}

arrayadapter_manage_addiction = new ArrayAdapter < String > (this, R.layout.single_row_manage_addictions, R.id.textViewSingleRowManageAddictions, arraylist_manage_addiction);
}
}


The main bug behind this is that, when I get the name using this:

View parentView = (View) arg0.getParent();
name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions)).getText()+"";


the listview of any record, it gives the name of first record only.
For example, if my first row has textview named "Gaming", when i click on any row, (for debugging purpose, i used
Toast.makeText(...))
it Toasts "Gaming" as the name for every record in the listview, though every record in the listview is unique. Please help me out with this.

SKK SKK
Answer
lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // selected item
        String selected = ((TextView) view.findViewById(R.id.your_textView_item_id)).getText().toString();

        Toast toast = Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT);
        toast.show();
    }
});