Ho un problema. Prima della modifica nel mio file XML, la mia listview era in grado di funzionare perfettamente. Ma ora, dopo alcune modifiche in xml, non funziona correttamente. La mia listview è personalizzata. Quindi, ho creato xml separati per rendere ogni singola riga nella listview.fare clic su elemento da listview
Il mio unico row.xml codice:
<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>
mio main.xml codice in cui risiede ListView:
<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>
E il mio codice Java per esso:
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);
}
}
Il bug principale dietro a questo è che, quando ricevo il nome utilizzando questo:
View parentView = (View) arg0.getParent();
name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions)).getText()+"";
ListView di qualsiasi record, si dà il nome di un solo primo record. Ad esempio, se la mia prima riga ha un testo denominato "Gioco", quando clicco su qualsiasi riga, (per il debugging, ho usato Toast.makeText(...))
it Toast "Gioco" come nome per ogni record nella listview, anche se ogni record nel listview è unico. Please help me con questo.
'arg0' è il vostro ListView ... usa' arg1' che è la riga cliccato ... – Selvin
... comunque per oggetto solo ricevono clic è meglio usare 'string name = (String) agr0.getAdapter(). getItem (arg2); ' – Selvin
@Selvin hai ragione. Capito. Apprezzato. –