Element aus der Listenansicht anklicken
Ich habe ein Problem. Vor der Änderung in meiner XML-Datei konnte meine Listenansicht einwandfrei funktionieren. Aber jetzt, nach einigen Änderungen in XML, funktioniert es nicht richtig. Meine Listenansicht ist benutzerdefiniert. Also habe ich eine separate XML-Datei erstellt, um jede einzelne Zeile in der Listenansicht zu rendern.
Meine einzelnerow.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>
Meinemain.xml Code, in dem sich die Listenansicht befindet:
<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>
Und mein Java-Code dafür:
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);
}
}
Der Hauptfehler dahinter ist, dass, wenn ich den Namen mit diesem bekomme:
View parentView = (View) arg0.getParent();
name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions)).getText()+"";
In der Listenansicht eines Datensatzes wird nur der Name des ersten Datensatzes angezeigt. Wenn zum Beispiel meine erste Zeile eine Textansicht mit dem Namen "Gaming" hat, habe ich beim Klicken auf eine Zeile (zum Debuggen) eine verwendetToast.makeText(...))
esToast "Gaming" als Name für jeden Datensatz in der Listenansicht, obwohl jeder Datensatz in der Listenansicht eindeutig ist. Bitte helfen Sie mir dabei.