Liste mit mehreren Views als Zeile + Contextmenu

  • Antworten:5
  • Bentwortet
Re Do
  • Forum-Beiträge: 8

02.03.2010, 23:49:40 via Website

Hi,

ich versuche mich gerade ein wenig daran ne App zu coden. Erfahrungen in Java habe ich bereits.

Ich habe eine Datenbank mit einer Tabelle "Tasks".
Nun möchte ich in einer Activity alle Tasks auflisten und das mache ich in folgender Form:
+TableLayout
++TableRow
+++View
+++TextView
+++TextView
+++CheckBox
++TableRow
+++ ...

Die Werte aus der Datenbank auslesen ist kein Problem, die Zeilen optisch so aufbauen wie ich das möchte klappt auch.
Jetzt würde ich gerne die durch klicken eines Tasks in der Liste die Möglichkeit geben, den Task zu editieren oder ganz zu löschen.
Das Contextmenu anlegen und auf TableRow legen klappt.

Jetzt zum Problem: Wie komme ich denn jetzt wieder runter auf die Werte der TextViews um diese aus der Datenbank zu schmeißen? Bekomme nur die Values des ContextMenus.

Mittlerweile hab ich soviel probiert das mein Code nicht mehr läuft und STRG+Z auch nichts mehr bringt...

PS:
1AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
2System.err.println(info.id);

liefert mir ne NullPointerException...

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

03.03.2010, 09:08:12 via Website

Ich hatte ein ähnliches Problem. Vor dem Zeigen des Kontext Menus musst du dir die ID merken da das Kontext-Menu den Fokus hat vergisst der ListView die ID.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Re Do
  • Forum-Beiträge: 8

03.03.2010, 12:18:20 via Website

Jaja, das ist mir schon klar :) Darum geht es mir ja, wie schaffe ich das? Das Erstellen der Einträge der Liste läuft ja dynamisch und die ID dieser Einträge wird immer um 1 inkrementiert.
BTW: ich arbeite nicht mit ListView, habs aber auch schon damit versucht...

Hat jemand vllt. mal ein Minimalbeispiel? Wurde bis jetzt bei google nicht fündig.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

04.03.2010, 15:47:05 via Website

So ganz verstehe ich nicht was du jetzt willst. Hier mal ein Bsp. mittels ListActivity.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Re Do
  • Forum-Beiträge: 8

08.03.2010, 12:57:06 via Website

Hi,
danke für deine Antwort. Leider komme ich noch nicht zum gewünschten Ergebnis...hier ist mal der relevante Code:

Mein xmlFile
1<?xml version="1.0" encoding="UTF-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical" android:layout_width="fill_parent"
4 android:layout_height="fill_parent">
5
6 <ListView android:id="@+id/android:list" android:layout_width="fill_parent"
7 android:layout_height="wrap_content">
8 </ListView>
9 <TextView android:id="@+id/android:empty"
10 android:layout_width="fill_parent" android:layout_height="wrap_content" />
11
12</LinearLayout>

ListKlasse
1imports[...]
2
3public class TaskOverviewListView extends ListActivity {
4
5 @Override
6 public void onCreate(Bundle savedInstanceState) {
7 super.onCreate(savedInstanceState);
8 setContentView(R.layout.playground);
9
10 ArrayList<Task> tasks = getTaskArray();
11
12 TaskAdapter taskAdapter = new TaskAdapter(this, tasks);
13 setListAdapter(taskAdapter);
14
15 registerForContextMenu(getListView());
16
17 }
18
19 public ArrayList<Task> getTaskArray(){
20 DBAdapter db = new DBAdapter(this);
21 ArrayList<Task> tempTasks = new ArrayList<Task>();
22
23 db.open();
24 Cursor c = db.getAllTasks();
25 if (c.moveToFirst()) {
26 do {
27 Task t = new Task(Integer.valueOf(c.getString(0)).intValue(), c
28 .getString(1), c.getString(2), c.getString(3), c
29 .getString(4));
30 tempTasks.add(t);
31 } while (c.moveToNext());
32 }
33 db.close();
34 return tempTasks;
35 }
36
37 public void onCreateContextMenu(ContextMenu menu, View v,
38 ContextMenuInfo menuInfo) {
39 super.onCreateContextMenu(menu, v, menuInfo);
40 menu.setHeaderTitle("Menu");
41 menu.add(0, 0, 0, "Edit");
42 menu.add(0, 1, 0, "Delete");
43 }
44
45 @Override
46 public boolean onContextItemSelected(MenuItem item) {
47 AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
48 .getMenuInfo();
49
50 switch (item.getItemId()) {
51
52 case 0:
53 System.err.println("EDIT");
54 return true;
55
56 case 1:
57 System.err.println("DELETE");
58 return true;
59 }
60 return super.onContextItemSelected(item);
61 }
62}
Meine Adapterklasse:
1class TaskAdapterView extends LinearLayout {
2 public TaskAdapterView(Context context, Task task) {
3 super(context);
4
5 LinearLayout.LayoutParams urgencyParams = new LinearLayout.LayoutParams(
6 10, LayoutParams.FILL_PARENT);
7 LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(
8 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,1);
9 LinearLayout.LayoutParams descParams = new LinearLayout.LayoutParams(
10 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
11
12 View urgency = new View(context);
13 switch (Integer.parseInt(task.getUrgency())) {
14 case 1:
15 urgency.setBackgroundColor(Color.GREEN);
16 break;
17 case 2:
18 urgency.setBackgroundColor(Color.BLUE);
19 break;
20 case 3:
21 urgency.setBackgroundColor(Color.RED);
22 break;
23 default:
24 break;
25 }
26
27 TextView space = new TextView(context);
28 space.setText(" ");
29
30 TextView subject = new TextView(context);
31 subject.setText(task.getSubject());
32
33 TextView tab = new TextView(context);
34 tab.setText("\t");
35
36 TextView description = new TextView(context);
37 description.setText(task.getDescription());
38
39 CheckBox done = new CheckBox(context);
40 done.setChecked(true);
41
42 addView(urgency, urgencyParams);
43 addView(space, textParams);
44 addView(subject, textParams);
45 addView(tab, textParams);
46 //addView(description, descParams);
47 addView(description, textParams);
48 addView(done, textParams);
49
50 }
51}
52
53public class TaskAdapter extends BaseAdapter {
54 private Context context;
55 private List<Task> tasklist;
56
57 public TaskAdapter(Context context, List<Task> tasklist) {
58 this.context = context;
59 this.tasklist = tasklist;
60 }
61
62 public int getCount() {
63 return tasklist.size();
64 }
65
66 public Object getItem(int position) {
67 return tasklist.get(position);
68 }
69
70 public long getItemId(int position) {
71 return position;
72 }
73
74 public View getView(int position, View convertView, ViewGroup parent) {
75 Task task = tasklist.get(position);
76 return new TaskAdapterView(this.context, task);
77 }
78
79}

Das Programm läuft soweit. Allerdings erscheint kein Contextmenu wenn ich auf meinen Listeneintrag (bestehend aus verschiedenen Views) klicke. Wenn ich allerdings eine TextView für das Contextmenu registriere, dann erscheint es.

Hat jemand eine Idee / findet jemand den Fehler den ich gemacht habe?

Antworten
Re Do
  • Forum-Beiträge: 8

11.03.2010, 19:55:09 via Website

Hi,

ich habe eine Lösung gefunden. Es lag an der Checkbox. Für alle die vor dem selben Problem stehen oder es einfach nur interessiert. Die magischen Zeilen Code sind die Folgenden:

1CheckBox done = new CheckBox(context);
2done.setFocusable(false); // Contextmenu appears
3done.setChecked(false);

Antworten