Avatar billede agertoft Nybegynder
25. november 2010 - 17:21 Der er 1 kommentar

ListView i Android

Jeg ønsker at lave en Android app med et ListView med en række kurser, som kommer fra en database. Når man klikker i ListView'et, skal man sendes videre til en ny intent, hvorfra ID'et fra databasen kan hentes, så der kan vises mere information fra kurset.

Mit problem er, at jeg ikke ved, hvordan jeg lægger ID'et ind i ListView'et og ikke ved, hvordan jeg henter det ud igen på den nye intent.

Min side med ListView'et ser således ud:

---------------------------------------------------

import java.io.IOException;
import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.InputFilter.LengthFilter;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;



public class Menu extends Activity {
    /** Called when the activity is first created. */

    private ListView lv1;
    private String lv_arr[]={"BSc Business Information Technology","BSc Computer Forensics","BSc Computer Science","BSc Computing","BSc Internet Computing","BSc IT Security","BSc Mobile Computing","BSc Software Engineering"};
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        lv1 = (ListView)findViewById(R.id.ListView01);
       
        DataBaseHelper myDbHelper;
        myDbHelper = new DataBaseHelper(this);

        try
        {
            myDbHelper.createDataBase();
        }
        catch (IOException ioe)
        {
   
            throw new Error("Unable to create database");
        }
   
        try
        {
            myDbHelper.openDataBase();
           
            SQLiteDatabase db = myDbHelper.getReadableDatabase();
           
            Cursor cursor = db.query("Courses", new String[]{"coursename"}, null, null, null, null, "coursename");
            startManagingCursor(cursor);
                       
            if (cursor.getCount() > 0)
            {
                if (cursor.moveToFirst())
                {
                    ArrayList strings = new ArrayList();
                    do
                    {                   
                        String mC = cursor.getString(0);
                        strings.add(mC); 
                    }
                    while (cursor.moveToNext());
                   
                    lv_arr = (String[]) strings.toArray(new String[strings.size()]);
                }
            } 
            else
            {
                Toast.makeText(this, "No courses in database", Toast.LENGTH_SHORT).show();
            }
           
            cursor.close();

            // By using setAdpater method in listview we an add string array in list.
            lv1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lv_arr));     
           
        }
        catch(SQLException sqle)
        {
            throw sqle;
        } 
       
        lv1.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View view, int position, long id)
            {
                Intent detailsIntent = new Intent(view.getContext(), CourseDetails.class);
                detailsIntent.putExtra("CourseID", position);
                startActivity(detailsIntent);
              }

        });
    }
}

---------------------------------------------------

Dvs i stedet for defailtIntent.putExtra("CourseID", position); vil jeg gerne sende kursusID'et videre i stedet for positionen. Dette vil jeg ligeledes gerne trække ud på den nye intent.

Nogle bud?
Avatar billede heinzdmx Nybegynder
25. november 2010 - 18:10 #1
Jeg har løst et lignende problem ved at lave en custom listview. Der bruger en custom adapter.

Så lægger jeg textview ind der ikke bliver vist. Og kan trække den ud som al andet text fra listview.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">

<TextView android:id="@+id/KursusNavn" android:layout_height="wrap_content"
android:textSize="20dip" android:layout_width="wrap_content" android:layout_margin="0px" android:paddingTop="0px"
android:layout_gravity="left" />

<TextView android:id="@+id/KursusID" android:layout_height="wrap_content"
android:layout_width="wrap_content" android:visibility="gone" />
   
</LinearLayout>


Så bruger jeg i onCreate:
KursusRowAdapter adapter = new KurusRowAdapter(this, skemaItems);
skemaList.setAdapter(adapter);


Og så kurusrowadapter, hvor KursusElement er en custom class, indeholdende to strings med henholdsvis KursusNavn og KursusID begge med get/set:

public class SkemaRowAdapter extends BaseAdapter
    {
        private List<KursusElement> elements;
        private Context mContext;

public SkemaRowAdapter(Context mContext, List<KursusElement> kursusItems)
        {
    this.mContext = mContext;
    this.elements = kursusItems;
}

public int getCount()
{
return elements.size();
}

public Object getItem(int position)
{
return elements.get(position);
}
public long getItemId(int position)
{
return position;
}

public View getView(int position, View convertView, ViewGroup parent)
        {
LinearLayout rowLayout;

final KurusElement element = elements.get(position);

if (convertView == null)
{
rowLayout = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.listview, parent, false);
}
else
{
rowLayout = (LinearLayout) convertView;
}

((TextView)rowLayout.findViewById(R.id.KurusNavn)).setText(element.getKursusNavn());
((TextView)rowLayout.findViewById(R.id.KurusID)).setText(element.getKurus());

    return rowLayout;
  }
}


Måske ikke det mest optimale, men det virker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester