2016-09-08 1 views
0

Ceci est ma première application et je vais avoir un certain Whit problème ListViewSQLite: id obtenir de ListView

Comment puis-je obtenir l'ID dans la base de données après avoir cliqué sur un article? Je ne peux pas utiliser la position car l'ID peut ne pas être continu et même s'il est dans l'ordre, il ne renvoie parfois pas l'ID correct.

ceci est mon code, Nous vous remercions de votre aide:

import android.content.Intent; 
import android.database.Cursor; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.ActionMode; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AbsListView; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 


public class livello1 extends AppCompatActivity { 
DatabaseHelper myDb; 
Button next; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    myDb = new DatabaseHelper(this); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.livello1); 
    populateListView(); 
    registerClick(); 
} 




private void registerClick(){ 
    ListView list =(ListView)findViewById(R.id.listViewMain); 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) { 



      Intent i = new Intent(livello1.this, bossi.note.Edit.class); 

      i.putExtra("id", position); 

      //i.putExtra("id", id); 
      startActivity(i); 

     } 
    }); 

} 

private void populateListView(){ 

    Cursor res = myDb.getAllData(); 
    String[] myItems = new String[myDb.numRow()]; 
    int cont = 0; 
    if(res.getCount() == 0){ 
     // show message 
     return; 
    } 
    while(res. moveToNext()){ 
     myItems[cont] = res.getString(1); 
     cont ++; 
    } 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.da_item, myItems); 
    ListView list =(ListView)findViewById(R.id.listViewMain);} 
+0

S'il vous plaît, écrivez comment fera la liste. C'est la méthode 'getView' – Vyacheslav

Répondre

0

Il y a beaucoup d'approches de solution.

Par exemple, vous pouvez stocker des ID si ArrayList avant l'initialisation ListView.

C'est execute "SELECT id FROM mytable"

stocker ensuite dans arraylist et utiliser tandis que la méthode de clic.

Exemple:

//in class declaration 
private  ArrayList<Long> ar_ids = new ArrayList<Long>; 



// 
     String sql = "SELECT id FROM table"; 
      Cursor cur = db.rawQuery(sql, null); 
      String out = ""; 
      ArrayList<Long> ar_ids = new ArrayList<Long>; 
      if (cur.moveToFirst()) { 
       do { 

        ar.add(cur.getString(0)); 
        } while (cur.moveToNext()); 
        }else{ 

        } 
} 
     cur.close(); 

pour événement click:

@Override 
     public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) { 



      Intent i = new Intent(livello1.this, bossi.note.Edit.class); 

      i.putExtra("id", ar_id.get(position)); 

//this is awsome! 
      startActivity(i); 

     } 

et initialiser ce quelque chose comme:

private void myfunc() { 
    String sql = "SELECT id FROM table"; 
    Cursor cur = myDb.rawQuery(sql, null); 
    String out = ""; 
    ArrayList<Long> ar_ids = new ArrayList<Long>; 
    if (cur.moveToFirst()) { 
     do { 

      ar.add(cur.getString(0)); 
      } while (cur.moveToNext()); 
      }else{ 
       throw new NullPointerException(); 
      } 
} 
cur.close(); 
} 

private void populateListView(){ 
    myfunc(); 
    Cursor res = myDb.getAllData(); 
    String[] myItems = new String[myDb.numRow()]; 
    int cont = 0; 
    if(res.getCount() == 0){ 
     // show message 
     return; 
    } 
    while(res. moveToNext()){ 
     myItems[cont] = res.getString(1); 
     cont ++; 
    } 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.da_item, myItems); 
    ListView list =(ListView)findViewById(R.id.listViewMain);} 
0

bien au lieu d'utiliser la ArrayAdapter vous pouvez prolonger un BaseAdapter ou ListAdapter ou même le ArrayAdapter pour rendre votre adaptateur personnalisé. Tout d'abord, créez une classe Java simple pour mapper les données de votre base de données, y compris id à un objet. Puis créez un BaseAdapter personnalisé au lieu d'utiliser ArrayAdapter. Dans votre classe BaseAdapter, vous devez remplacer diverses méthodes, notamment les méthodes getItem et getItemId. Vous pouvez maintenant renvoyer l'objet mappé entier de la méthode getItem et obtenir simplement l'objet de l'élément sélectionné de ListView en utilisant la méthode listView.getSelectedItem() dans la classe Activity ou Fragment. Une fois que vous obtenez l'objet, vous pouvez accéder facilement à l'identifiant.

Vous pouvez trouver un bon exemple et l'explication d'un adaptateur personnalisé here

A propos de la cartographie du résultat de base de données à un objet, vous pouvez obtenir un concept here

+0

Il n'y a rien de mal à étendre' ArrayAdapter'. Toutes ces méthodes que vous mentionnez peuvent être remplacées –

+0

Je ne lui dis pas de ne pas étendre ArrayAdapter.Je lui dis seulement de ne pas simplement utiliser le ArrayAdapter sans l'étendre –

+0

de toute façon j'ai maintenant ajouté le ArrayAdapter: p –

0

Ici, vous pouvez vous remplacer la classe de code avec celui-ci, je ai ajouté un cursorAdapter et l'ai attaché avec votre ListView, dans l'adaptateur j'ai ajouté une méthode pour obtenir l'Id que je c tout à partir de l'écouteur de clic pour récupérer l'ID du curseur, vous devrez définir le numéro de colonne pour _ID dans public void getId(int position) de classe MyCursorAdapter ci-dessous.

import android.content.Intent; 
import android.database.Cursor; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.ActionMode; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AbsListView; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 


public class livello1 extends AppCompatActivity { 
DatabaseHelper myDb; 
Button next; 
private MyCursorAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    myDb = new DatabaseHelper(this); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.livello1); 
    populateListView(); 
    registerClick(); 
} 




private void registerClick(){ 
    ListView list =(ListView)findViewById(R.id.listViewMain); 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) { 

      Intent i = new Intent(livello1.this, bossi.note.Edit.class); 

      //retrieve id from cursor 
     int _id = adapter.getId(position) 
      i.putExtra("id", _id); 

      //i.putExtra("id", id); 
      startActivity(i); 

     } 
    }); 

} 

private void populateListView(){ 

    Cursor res = myDb.getAllData(); 
    adapter = new MyCursorAdapter(this, res, 0); 
    ListView list =(ListView)findViewById(R.id.listViewMain); 
    list.setAdapter(adapter); 
} 


//adapter for list view 
class MyCursorAdapter extends CursorAdapter { 

    Cursor cursor; 

    // Default constructor 
    public MyCursorAdapter(Context context, Cursor cursor, int flags) { 
     super(context, cursor, flags); 
     this.cursor = cursor; 
    } 

    public void bindView(View view, Context context, Cursor cursor) { 
     String text = cursor.getString(1); 

     //make sure the TextView id is "@+id/text1" in da_item.xml 
     TextView tvText = (TextView) view.findViewById(R.id.text1); 
     tvText.setText(text); 
    } 

    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     LayoutInflator inflater = (LayoutInflater) context.getSystemService(
        Context.LAYOUT_INFLATER_SERVICE); 
     return Inflater.inflate(R.layout.da_item, parent, false); 
    } 

    public int getId(int position){ 
     cursor.moveToPosition(position); 
     int colId = //set id column number here 
     int id = cursor.getLong(colId); 
     return id; 
    } 
} 

Puisque le code est non testé, vous pourriez faire face à un problème de construction en début, mais il devrait donner une idée de ce qui se passe dans le code. n'hésitez pas à poser toute question si vous rencontrez un problème dans la compilation