2017-01-21 3 views
0

Hae stackoverflow gurus、複数の値をsqliteデータベースから取得し、androidのlistviewに取り込みます。

私は援助を探しています。私はインターネット上ではなく無駄に研究してきました。私はlistviewにフェッチされたすべての値を追加したいと思います。私はデータベースに値を挿入することができて、それらのすべてをフェッチすることができましたが、リストビューに追加することはできません。 以下の関数は完璧に動作し、データをリストとして返します。

public List<Contact> getAllContacts() { 
     List<Contact> contactList = new ArrayList<Contact>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       Contact contact = new Contact(); 
       contact.setID(Integer.parseInt(cursor.getString(0))); 
       contact.setName(cursor.getString(1)); 
       contact.setPhoneNumber(cursor.getString(2)); 
       // Adding contact to list 
       contactList.add(contact); 
      } while (cursor.moveToNext()); 
     } 

     // return contact list 
     return contactList; 
    } 

また、以下の機能が完璧に動作し、出力したログ

} 


private void showRecords() { 

     List<Contact> contacts = db.getAllContacts(); 

     for (Contact cn : contacts) { 

      //lv.setAdapter(new dataAdapter(this, cn.getID(), cn.getName(), cn.getPhoneNumber())); 
      String log = "Id: " + cn.getID() + " ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber(); 
      // Writing Contacts to log 
      //Log.d("Name: ", log); 
      Toast.makeText(getApplicationContext(),log, Toast.LENGTH_SHORT).show(); 
     } 
    } 

を使用して取得したすべての値が今、私はしかし、作業しているため、リストビューを作成している、私はデータを追加することができませんよ表示されているようにリストビューに追加します。

private void showRecords() { 

      List<Contact> contacts = db.getAllContacts(); 

      for(int i=0; i < contacts.size();i++){ 
       lv.setAdapter(new dataAdapter(this, cn.getID(),cn.getName(), cn.getPhoneNumber())); 
      }   
    } 

私の質問は、どのようにしてList<Contact> contacts = db.getAllContacts();をlistview lvに埋め込むことができますか?

これは

public class dataAdapter extends BaseAdapter { 

    Context context; 
    String [] name; 
    String [] phone; 
    int [] dataId; 
    private static LayoutInflater inflater=null; 
    public dataAdapter(Context context, int[] dataId, String[] name, String[] phone){ 

     this.context=context; 
     this.dataId=dataId; 
     this.name=name; 
     this.phone=phone; 

     inflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 

    public int getCount() { 
     return dataId.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public class Holder{ 
     TextView nameV; 
     TextView phoneV; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent){ 
     Holder holder=new Holder(); 
     View rowView; 
     rowView=inflater.inflate(R.layout.thelist, null); 

     holder.nameV=(TextView) rowView.findViewById(R.id.txt1); 
     holder.phoneV=(TextView) rowView.findViewById(R.id.txt2); 


     holder.nameV.setText(name[position]); 
     holder.phoneV.setText(phone[position]); 

     rowView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Toast.makeText(context,name[position],Toast.LENGTH_SHORT).show(); 

      } 
     }); 
     return rowView; 
    } 
} 
+0

http://www.journaldev.com/10416/android-listview-with-custom-adapter-example-tutorialカスタムアダプタ –

+0

のこのチュートリアルに従ってください。あなたの 'showRecords'メソッドが間違っています。レコードをループしたり、それぞれを設定したりすることはありません。あなたは 'List 'でバックアップされたアダプタの_single instance_を作成し、それを設定してください_once_ –

+0

Davidさん、私は完全に混乱しているので、私のためにそれをすることができます –

答えて

1

全体のDataAdapterクラスで一度だけ表示するアダプタをリストする連絡先のリストを渡す代わりに、すべての新しいアイテム用のアダプタを設定しないでください。新しい項目を追加する場合は、既存のアダプタに追加を追加します。

あなたはこの

private void showRecords() { 
    List<Contact> contacts = db.getAllContacts(); 
    lv.setAdapter(new dataAdapter(this, contacts));  
} 

それとも、より良い理解のために上記のコメントで提供チュートリアルに従うように行うことができます。

代わりに自分の連絡先クラスのすべてのフィールドの配列を取るの編集1 、あなた同様にgetCountメソッドがあるべきあなたがList<Contact> contacts = db.getAllContacts()

..... 
..... 
List<Contact> mContacts; 

DataAdapter(Context context,List<Contact> contact) { 
    this.context=context; 
    this.mContacts=contacts; 
    ..... 
    ..... 
} 

から持っている連絡先のリストを、取る

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

getView()メソッドは

public View getView(final int position, View convertView, ViewGroup parent) { 
    Contact contact = mContact.get(position); 
    .... 
    .... 
    holder.nameV.setText(contact.getName()); 
    holder.phoneV.setText(contact.getPhone()); 
    .... 
    .... 
    return view; 
} 
である必要があります。

そして、あなたは、この既存のアダプタに追加した場合、私はまだあなたは上記のリンクにあるチュートリアルの言及を通過することをお勧めこの

public void add(Contact contact) { 
    if(mContact != null) { 
     mContact.add(contact); 
     // This will refresh the list. 
     notifyDataSetChanged(); 
    } 
} 

のようなカスタムメソッドを追加するには、お使いのアダプタクラスは、より良いために多くの変更を必要としますインプランテーション。

+0

まだ動作していませんが、setAdapter()クラスには4つのパラメータがあります。 –

+1

4つのパラメータのうちの3つがContactオブジェクトを作成します。代わりに連絡してください。 'DataAdapter(Context context、List contacts)'のように –

+0

私はあなたがヒントを持って参照してください、私はlistAdapter全体を投稿することはできますか? –

関連する問題