ListView in einem LinearLayout

  • Antworten:5
Hannah H.
  • Forum-Beiträge: 16

17.06.2010, 17:42:16 via Website

Hallo,

ich hab eine Frage.

Ich hab mir ein Suchen Layout gebastelt und dann Festgestellt das ich manchmal sehr viele Such Ergebnisse habe, jetzt würde ich gerne eine ListView unterhalt des Suchen Formulas einbinden.

Kann mir da jemand einen Tip geben oder weiß jemand wie das geht?

Meine XML sieht bis jetzt so aus:
1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout
3 android:id="@+id/Suche"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 android:orientation="vertical"
7 xmlns:android="http://schemas.android.com/apk/res/android"
8 >
9 <TextView
10 android:id="@+id/BarBeschriftungSuche"
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:layout_marginBottom="5px"
14 android:text="Suche nach einer Bar:"
15 android:textStyle="bold" />
16
17 <EditText
18 android:id="@+id/SucheBar"
19 android:layout_width="fill_parent"
20 android:layout_marginBottom="10px"
21 android:textSize="18dip"
22 android:lines="1"
23 android:layout_height="45dip"
24 android:padding="5dip" />
25
26 <RelativeLayout
27 xmlns:android="http://schemas.android.com/apk/res/android"
28 android:id="@+id/title"
29 android:layout_width="wrap_content"
30 android:layout_height="wrap_content"
31 android:layout_gravity="left|center" >
32 <Button
33 android:id="@+id/SucheStarten"
34 android:layout_width="wrap_content"
35 android:layout_height="wrap_content"
36 android:layout_marginBottom="10px"
37 android:text="Suche starten" />
38 <Button
39 android:id="@+id/TakeLocation"
40 android:layout_width="wrap_content"
41 android:layout_height="wrap_content"
42 android:layout_marginBottom="10px"
43 android:text="Ort übernehmen"
44 android:layout_toRightOf="@id/SucheStarten"
45 android:layout_marginLeft="10px" />
46 </RelativeLayout>
47
48 <TextView
49 android:id="@+id/Ergebnis"
50 android:layout_width="wrap_content"
51 android:layout_height="wrap_content"
52 android:layout_marginBottom="5px"
53 android:textSize="18dip"
54 android:textStyle="bold"/>
55
56 <ListView
57 android:id="@+id/SuchErgebnis"
58 android:layout_width="fill_parent"
59 android:layout_height="fill_parent" />
60 <!--
61 <TextView
62 android:id="@+id/SuchErgebnis"
63 android:layout_width="wrap_content"
64 android:layout_height="wrap_content"
65 android:layout_marginBottom="5px"
66 android:textStyle="bold"/>
67 -->
68</LinearLayout>

In das SuchErgenis werden die Suchergebnisse geschrieben, oder mach ich da schon was falsch?
Danke schon mal!

LG
Hannah

— geändert am 17.06.2010, 17:43:11

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

17.06.2010, 17:45:46 via Website

Was hier fehlt um dir zu helfen ist der Code der die ListView füllt!

— geändert am 17.06.2010, 17:45:59

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

Antworten
Hannah H.
  • Forum-Beiträge: 16

17.06.2010, 18:16:59 via Website

Der Code wäre dafür:
1if(ergList.size()>0) {
2
3 for(Iterator i = ergList.iterator();i.hasNext();) {
4 ergebnis += ((Bar) i.next()).getName() + "\n"; // ergebnis ist ein String muss dieser static sein?
5 }
6 setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_1, ergebnis)); //hier gibt er immer ein Fehler das es kein Constructor definiert wäre
7
8 ListView lv = getListView();
9 lv.setTextFilterEnabled(true);
10
11 }

Die Klasse leitet auch von der ListActivity ab.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

17.06.2010, 18:30:02 via Website

Zurerstmal :

Die Klasse leitet auch von der ListActivity ab.

Wie tuest du das wenn du mehr als eine List hast ? Hier ist wohl Activity passender!

Kompiler Fehler solltest du schon beheben!

ergebnis += ((Bar) i.next()).getName() + "\n"; // ergebnis ist ein String muss dieser static sein?
5 }

Wieso sollte Ergebnis static sein ? Du willst das ganze doch dynamisch halten!
Schreibe den Code so das auch jemand der deine Gedankengänge jetzt nicht so kennt ihn versteht:

final List<String> results = new ArrayList<String>();
for(Iterator i = ergList.iterator();i.hasNext();)
{
final Bar bar = (Bar) iter.next();
final String ergebnis = bar.getName();
results.add(ergebnis);
}


Der Compiler meckert da er nur einen ListAdapter zulässt, bitte die Api Doc für solch trivial Fehler konsultieren: http://developer.android.com/intl/zh-CN/reference/android/app/ListActivity.html#setListAdapter%28android.widget.ListAdapter%29


hth,
Mac

PS : Evtl kann man den Iterator ebenfall typ sicher bekommen, mir ist unklar wo der herkommt!

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 48

17.06.2010, 18:41:26 via Website

Mac Systems

Der Compiler meckert da er nur einen ListAdapter zulässt, bitte die Api Doc für solch trivial Fehler konsultieren: http://developer.android.com/intl/zh-CN/reference/android/app/ListActivity.html#setListAdapter%28android.widget.ListAdapter%29

Ne ne, es wird ja ein ListAdapter übergeben, nämlich der ArrayAdapter ! Das Problem ist aber, dass der Konstruktor von diesem falsch gewählt wurde..es gibt keinen Konstruktor mit einem String als 3. Parameter! (Höchstens ein String-Array!)

http://developer.android.com/guide/tutorials/views/hello-listview.html
http://developer.android.com/reference/android/widget/ArrayAdapter.html

— geändert am 17.06.2010, 18:42:01

Antworten
Hannah H.
  • Forum-Beiträge: 16

22.06.2010, 18:05:40 via Website

So ich bin es nochmal!

Jetzt hab ich ein anderes Problem.

Ich hab eine Suche gebaut und wenn ich dann auf den Suchenbutton klicke, dann soll eine Liste angezeigt werden. Diese Liste ist dann wieder Verlinkt.

1public class SearchBar extends ListActivity{
2 private final String tag = "SearchBar";
3 private ArrayList<Bar> ergList;
4 private Button take;
5 private boolean alternativeLocation = false;
6 private ListAdapter searchAdapter;
7 //private SearchAdapter searchAdapter;
8
9 @Override
10 protected void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12
13 alternativeLocation = getIntent().getBooleanExtra("alternativeLocation", false);
14 //TODO Ansicht als Liste
15
16 /* Create and modify titlebar */
17 requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
18 setContentView(R.layout.search);
19 getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
20
21 ImageButton button1 = (ImageButton)findViewById(R.id.button1);
22 button1.setBackgroundResource(R.drawable.button_bg_list);
23 button1.setOnClickListener(new OnClickListener() {
24 public void onClick(View arg0) {
25 Intent intent = new Intent(SearchBar.this, ListBars.class);
26 intent.putExtra("alternativeLocation", alternativeLocation);
27 startActivity(intent);
28 finish();
29 }
30 });
31 ImageButton button2 = (ImageButton)findViewById(R.id.button2);
32 button2.setBackgroundResource(R.drawable.button_bg_map);
33 button2.setOnClickListener(new OnClickListener() {
34 public void onClick(View arg0) {
35 Intent intent = new Intent(SearchBar.this, GoogleMap.class);
36 intent.putExtra("alternativeLocation", alternativeLocation);
37 startActivity(intent);
38 finish();
39 }
40 });
41
42 ImageButton button3 = (ImageButton)findViewById(R.id.button3);
43 if(alternativeLocation) {
44 button3.setBackgroundResource(R.drawable.button_bg_gps);
45 button3.setOnClickListener(new OnClickListener() {
46 public void onClick(View v) {
47 final ProgressDialog progress = ProgressDialog.show(SearchBar.this,
48 "Bitte warten...", "Derzeitige GPS-Koordinaten werden berechnet", true);
49
50 Runnable viewOrders = new Runnable(){
51 public void run() {
52 LaCarte.location.startLocationFinding(null);
53 LaCarte.location.calculateDistances();
54
55 startActivity(new Intent(SearchBar.this, ListBars.class));
56 progress.cancel();
57 finish();
58 }
59 };
60
61 Thread thread = new Thread(null, viewOrders, "Startscreen");
62 thread.start();
63 }
64 });
65 }
66 else {
67 button3.setVisibility(Button.INVISIBLE);
68 }
69
70 final EditText barSearch = (EditText)findViewById(R.id.SucheBar);
71 final EditText streetSearch = (EditText)findViewById(R.id.SucheOrt);
72
73 take = (Button) findViewById(R.id.TakeLocation);
74 take.setVisibility(Button.GONE);
75
76 Button buttonSearch = (Button) findViewById(R.id.SucheStarten);
77 buttonSearch.setOnClickListener(new OnClickListener() {
78
79
80 public void onClick(View v) {
81 take.setVisibility(Button.GONE);
82
83
84 TextView sucherg = (TextView)findViewById(R.id.Ergebnis);
85 sucherg.setText("Suchergebnis:");
86
87 String bar = barSearch.getText().toString();
88 String address = streetSearch.getText().toString();
89
90 ergList = new ArrayList<Bar>();
91 String ergebnis = "";
92 if(!bar.equals("") && !address.equals("")) {
93 int ergLoc = searchLocation(address);
94 switch(ergLoc) {
95 case 0:
96 sucherg.setText("Keine Uebereinstimmenden Bars gefunden.");
97 break;
98 case 1: {
99 int ergBar = searchBar(bar);
100 switch(ergBar) {
101 case 0:
102 sucherg.setText("Keine Bar mit diesem Namen gefunden.");
103 break;
104 case 1:
105 break;
106 }
107 break;
108 }
109 case 2:
110 sucherg.setText("Fehler bei der Locationsuche. Dienst nicht erreichbar.");
111 break;
112 case 3:
113 sucherg.setText("Fehler bei der Locationsuche. Location nicht vorhanden.");
114 break;
115 }
116 }
117 else if(!bar.equals("")) {
118 int erg = searchBar(bar);
119
120 switch(erg) {
121 case 0:
122 sucherg.setText("Keine Bar mit diesem Namen gefunden.");
123 break;
124 case 1:
125 break;
126 }
127 }
128 else if(!address.equals("")) {
129 int erg = searchLocation(address);
130
131 switch(erg) {
132 case 0:
133 sucherg.setText("Keine Uebereinstimmenden Bars gefunden.");
134 break;
135 case 1:
136 break;
137 case 2:
138 sucherg.setText("Fehler bei der Locationsuche. Dienst nicht erreichbar.");
139 break;
140 case 3:
141 sucherg.setText("Fehler bei der Locationsuche. Location nicht vorhanden.");
142 break;
143 }
144 }
145 else {
146 sucherg.setText("Bitte eine Eingabe machen!");
147 }
148
149 Collections.sort(ergList);
150 searchAdapter = new SearchAdapter(this, R.layout.row, ergList);
151 setListAdapter(searchAdapter);
152 ListView lv = getListView();
153 lv.setTextFilterEnabled(true);
154
155 lv.setOnItemClickListener(new OnItemClickListener() {
156 public void onItemClick(AdapterView<?> parent, View view,
157 int position, long id) {
158
159 Bar bar = ergList.get(position);
160
161 Intent intent = new Intent(SearchBar.this, BarDetails.class);
162 intent.putExtra("barId", bar.getId());
163 startActivity(intent);
164
165 }
166 });
167 }
168 });
169 }
170
171 /**
172 * Searches for bars around the location 'address' with distance<=5km.
173 * @param address
174 * @return int
175 * 0 => no bars found
176 * 1 => some bars found
177 * 2 => IOException
178 * 3 => location not found
179 */
180 public int searchLocation(final String address) {
181 //TODO andere Stadt beachten
182 Geocoder geo = new Geocoder(SearchBar.this, Locale.getDefault());
183 boolean hasBar = false;
184
185 try {
186 Address myAddress = geo.getFromLocationName(address,1).get(0);
187 double laengengrad = myAddress.getLongitude();
188 double breitengrad = myAddress.getLatitude();
189
190 Collection<Bar> barObjects = LaCarte.bars.values();
191 Iterator<Bar> i = barObjects.iterator();
192 while(i.hasNext()) {
193 Bar b = i.next();
194 float[] results = new float[3];
195 Location.distanceBetween(breitengrad, laengengrad, b.getBreitengrad(), b.getLaengengrad(), results);
196 float distance = results[0];
197 if(distance<=5000) {
198 if(!ergList.contains(b)) {
199 ergList.add(b);
200 }
201 hasBar = true;
202 }
203 }
204
205 if(!hasBar) {
206 return 0;
207 }
208 else {
209 take.setVisibility(Button.VISIBLE);
210 take.setOnClickListener(new OnClickListener() {
211 public void onClick(View v) {
212 LaCarte.location.startLocationFinding(address.toString());
213 LaCarte.location.calculateDistances();
214
215 Intent intent = new Intent(SearchBar.this, ListBars.class);
216 intent.putExtra("alternativeLocation", true);
217 startActivity(intent);
218 finish();
219 }
220 });
221 return 1;
222 }
223 } catch (IOException e) {
224 e.printStackTrace();
225 Log.e(tag, "IOException:");
226 Log.e(tag, e.getMessage());
227 return 2;
228 } catch (IndexOutOfBoundsException e) {
229 Log.e(tag, "IndexOutOfBounds:");
230 Log.e(tag, e.getMessage());
231 return 3;
232 }
233 }
234
235 /**
236 * Searches for bars on actual location.
237 * @param bar
238 * @return int
239 * 0 => no bars found
240 * 1 => some bars found
241 */
242 public int searchBar(String bar) {
243 Iterator<Bar> i;
244
245 if(ergList.size()>0) {
246 i = ergList.iterator();
247 }
248 else {
249 i = LaCarte.bars.values().iterator();
250 }
251
252 boolean hasBar = false;
253 while(i.hasNext()) {
254 Bar b = i.next();
255 String barName = b.getName().toLowerCase();
256 if(!barName.contains(bar.toLowerCase())) {
257 if(ergList.contains(b)) {
258 ergList.remove(b);
259 }
260 hasBar = true;
261 }
262 }
263 if(!hasBar) {
264 return 0;
265 }
266 else {
267 return 1;
268 }
269 }
270
271public class SearchAdapter extends ArrayAdapter<Bar> {
272
273 private ArrayList<Bar> items;
274
275 public SearchAdapter(Context context,int textViewResourceId, ArrayList<Bar> items) {
276 super(context, textViewResourceId, items);
277 this.items = items;
278 }
279
280 public SearchAdapter(OnClickListener onClick, int textViewResourceId,
281 ArrayList<Bar> items) {
282 super(onClick, textViewResourceId, items);
283 this.items = items;
284 }
285
286 @Override
287 public View getView(int position, View convertView, ViewGroup parent) {
288 View v = convertView;
289 if (v == null) {
290 LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
291 v = vi.inflate(R.layout.row, null);
292 }
293
294 Bar o = items.get(position);
295 if (o != null) {
296 TextView tb = (TextView) v.findViewById(R.id.topBarname);
297 TextView tt = (TextView) v.findViewById(R.id.topTime);
298 TextView bk = (TextView) v.findViewById(R.id.bottKm);
299 if (tb != null) {
300 tb.setText(o.getName());
301 }
302 if (tt != null) {
303 tt.setText("Zeit: 17 - 20 Uhr");
304 }
305 if(bk != null){
306 bk.setText("Entfernung: "+ o.getDistanceInMeters()+ " m");
307 }
308 }
309 return v;
310 }
311}
312}

Folgenden Fehler bekomme ich dann, das er hier
searchAdapter = new SearchAdapter(this, R.layout.row, ergList);
folgenden Konstruktor haben möchte:
public SearchAdapter(OnClickListener onClick, int textViewResourceId,
ArrayList<Bar> items) {
super(onClick, textViewResourceId, items);
this.items = items;
}

Ich verstehe aber nicht wieso er immer ein OnClickListener haben möchte.
Wenn ich aber diesen Konstruktor erstelle, dann ist er fehlerhaft und er möchte onClick zu Context chasten

Kann mir evtl. jemand sagen was ich falsch mache?

Antworten