Egyedi lista Android

Egyedi lista Android
2012-03-04T17:53:12+01:00
2012-03-07T17:31:22+01:00
2022-11-24T23:15:34+01:00
marbo
Sziasztok!

Androidban akarok egy saját listát készíteni.
Webszerverről lekért adatokat tárolom lokális adatbázisba SQLite Manager segítségével.
Ezeket az adatokat akarom egy listába tenni.
A lista első sorába lenne a név, alatta a cím.
Eddig minden ok, csak nekem kellene az, hogy a név más színű és betű típusú legyen, mint a cím.
Tudom, hogy saját listát kell csinálnom.
Találtam is rengeteg hasznos tutorialt a neten.
Mellékelek kódot, hogy érthető legyen a kérdésem.

adapter = null; final Context tempcont = this; lv = (ListView)this.findViewById(R.id.lv_1); dialog = ProgressDialog.show(LMarkers.this, "Wait", "", true); Thread thr =new Thread(new Runnable() { public void run() { ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); result=Main.GetDataFromWeb(nameValuePairs); try{ JSONArray jArray = new JSONArray(result); Integer j=0; String[] SArray={"_id","name","address"}; for(int i=0;i<jArray.length();i++){ JSONObject json_data = jArray.getJSONObject(i); if (DataBaseHelper.DataExists("markers",SArray,"name='"+json_data.getString("name")+"'").equals(false)) j=j+1; } if (j>0){ String[] name = new String[j]; String[] address=new String[j]; String[] temp_ids = new String[j]; String[] temp_selected = new String[j]; if (savedInstanceState==null){ Main.setIds(temp_ids); Main.setSelected(temp_selected); } j=0; for (int i=0;i<jArray.length();i++){ JSONObject json_data = jArray.getJSONObject(i); if (DataBaseHelper.DataExists("markers",SArray,"name='"+json_data.getString("name")+"'").equals(false)){ name[j] = (json_data.getString("name")); address[j]=(json_data.getString("address")); temp_ids[j]=(json_data.getString("id")); temp_selected[j]= "0"; j=j+1; } } adapter = new CustomAdapter(tempcont,R.layout.row, name); } else { Toast toast = Toast.makeText(getApplicationContext(),"Valami nem jo",25); toast.show(); finish(); } } catch(Exception e){ Log.e("error_log2", e.toString()); } handler2.sendEmptyMessage(0); } }); thr.start(); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { String[] selected = Main.getSelected(); if (selected[arg2].toString().equals("0")) { selected[arg2]="1"; arg1.setBackgroundColor(Color.GREEN); } else { selected[arg2]="0"; arg1.setBackgroundColor(Color.BLACK); } Main.setSelected(selected); } }); Button btn_cancel=(Button)this.findViewById(R.id.btn_cancel); btn_cancel.setOnClickListener(new OnClickListener(){ public void onClick(View v) { finish(); } }); } private Handler handler2 = new Handler() { public void handleMessage(Message msg) { dialog.dismiss(); lv.setAdapter(adapter); } }; private void mLockScreenRotation() { switch (this.getResources().getConfiguration().orientation) { case Configuration.ORIENTATION_PORTRAIT: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; case Configuration.ORIENTATION_LANDSCAPE: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; } } private void mUnlockScreenRotation() { this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } private class CustomAdapter extends ArrayAdapter<String> { private String[] items; public CustomAdapter(Context context, int textViewResourceId, String[] name) { super(context, textViewResourceId, name); this.items = name; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.row, null); } String text = items[position]; String[] selected = Main.getSelected(); TextView name = (TextView)v.findViewById(R.id.name); TextView address=(TextView)findViewById(R.id.address); if (text!=null) if (selected[position]!=null){ if (selected[position].toString().equals("1")) v.setBackgroundColor(Color.GREEN); else v.setBackgroundColor(Color.BLACK); name.setText(text); } return v; } }
Itt ugye lekérem az adatokat és beleteszi egy listába.
Az lenne a kérdésem, hogy hogyan lehetne azt megodlani, hogy nem csak a név legyen a listába, hanem alatta a cím is és külön színű és betűtípus legyen?!
Próbáltam úgy, hogy létrehozok egy static osztályt és ott adom meg a row.xml fájlban definiált name és addressnek az értéket, de nem sikerül
Nagyon szépen megköszönnék mindenfajta segítséget.
Mutasd a teljes hozzászólást!
Nem nagyon értem a problémád. :)
Van két tömböd, melyek ugyanolyan hosszúak.

String[] names ... String[] addresses ... List<ListItem> items = new ArrayList<ListItem>(); for(int i=0; i<items.length; i++) { ListItem item = new ListItem(); item.setName(names[i]); item.setAddress(addresses[i]); items.add(item); } // ... CustomAdapter adapter = new CustomAdapter(tempcont, R.layout.row, items);

Továbba a CustomAdapter oszályod konstruktorából hiányzik a
this.items = items;
sor. A te "items" listád mindig "null" marad. Egyébként nem is szükséges neked külön tárolnod az elemeket, az CustomAdapter-ed örökli a "getItem(position)" metódust.

@Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.row, null); } ListItem i=getItem(position); if(i!=null){ TextView name=(TextView)v.findViewById(R.id.name); TextView address=(TextView)v.findViewById(R.id.address); if(name!=null) name.setText("Name"+i.getName()); if(address!=null) address.setText("Address"+i.getAddress()); } return v; } }
Mutasd a teljes hozzászólást!

  • Az ArrayAdapter nem csak String-eket tartalmazhat.

    Készítesz egy osztályt, aminek elemei tartalmazzák azokat az adatokat amelyek egy lista elembe kell bekerüljenek:
    public class ListItem { public String name; public String address; }

    Utánna az ArrayAdapter-ben ezt az osztályt használod:

    public class CustomAdapter extends ArrayAdapter<ListItem> { @Override public View getView(int position, View convertView, ViewGroup parent) { ListItem item = items[position]; // ... } }
    Mutasd a teljes hozzászólást!
  • Köszi, hogy próbálsz segíteni!
    Megmutatom, hogy eddig mit csináltam:
    Létrehoztam a ListItem osztályt setterekkel és a getterekkel.

    public class ListItem { public String name=""; public String address=""; public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setAddress(String address){ this.address=address; } public String getAddress(){ return address; } }
    A CustomAdapter osztályom így néz ki:

    private class CustomAdapter extends ArrayAdapter<ListItem> { private ArrayList<ListItem> items; public CustomAdapter(Context context, int textViewResourceId,ArrayList<ListItem> items) { super(context, textViewResourceId, items); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.row, null); } ListItem i=items.get(position); if(i!=null){ TextView name=(TextView)v.findViewById(R.id.name); TextView address=(TextView)v.findViewById(R.id.address); if(name!=null){ name.setText("Name"+i.getName()); } if(address!=null){ address.setText("Address"+i.getAddress()); } } return v; } }
    Remélem itt jól adtam meg, hogy name és az address mezőbe mit írasson.
    Valamint a fő osztályban megadtam a lista nevét:

    item = new ArrayList<ListItem>();
    és az adapter is

    adapter = new CustomAdapter(tempcont, R.layout.row, item);
    Na most arra nem tudok rájönni sehogy, hogy, hogy kell azt megcsinálni, hogy az adatbázisból lekért adatokat, amiket a name[] és address[] tömbökbe tárolok, hogy az items listához hozzáadja, mert az meg ListItem adatokat fogad.
    Köszönöm előre is a választ.
    Mutasd a teljes hozzászólást!
  • Nem nagyon értem a problémád. :)
    Van két tömböd, melyek ugyanolyan hosszúak.

    String[] names ... String[] addresses ... List<ListItem> items = new ArrayList<ListItem>(); for(int i=0; i<items.length; i++) { ListItem item = new ListItem(); item.setName(names[i]); item.setAddress(addresses[i]); items.add(item); } // ... CustomAdapter adapter = new CustomAdapter(tempcont, R.layout.row, items);

    Továbba a CustomAdapter oszályod konstruktorából hiányzik a
    this.items = items;
    sor. A te "items" listád mindig "null" marad. Egyébként nem is szükséges neked külön tárolnod az elemeket, az CustomAdapter-ed örökli a "getItem(position)" metódust.

    @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.row, null); } ListItem i=getItem(position); if(i!=null){ TextView name=(TextView)v.findViewById(R.id.name); TextView address=(TextView)v.findViewById(R.id.address); if(name!=null) name.setText("Name"+i.getName()); if(address!=null) address.setText("Address"+i.getAddress()); } return v; } }
    Mutasd a teljes hozzászólást!
  • Nagyon-nagyon-nagyon szépen köszönöm!
    Örök hála!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd