Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
187 views
in Technique[技术] by (71.8m points)

android - 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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
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();
    }
});

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...