2017-11-15 5 views
0

の後に繰り返されています。SQLiteデータベースにURLからいくつかのフィールドを追加しようとしていました。レコードが追加された後。私はCustomAdapterのgetView()メソッドでやっています。私のやり方が間違っているなら、私に何か解決策を提案してください。URLからSQLiteデータベースにアンドロイドでデータを追加している間に、レコードが1

は、ここに私のDatabaseHandlerクラス

public class DatabaseHandler extends SQLiteOpenHelper { 
// All Static variables 
// Database Version 
private static final int DATABASE_VERSION = 2; 

// Database Name 
private static final String DATABASE_NAME = "contactsManager"; 

// Contacts table name 
private static final String TABLE_CONTACTS = "contacts"; 

// Contacts Table Columns names 
private static final String KEY_ID = "id"; 
private static final String KEY_NAME = "name"; 
private static final String KEY_PH_NO = "phone_number"; 

public DatabaseHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

// Creating Tables 
@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
      + KEY_PH_NO + " TEXT" + ")"; 
    db.execSQL(CREATE_CONTACTS_TABLE); 
} 

// Upgrading database 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // Drop older table if existed 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); 

    // Create tables again 
    onCreate(db); 
} 

/** 
* All CRUD(Create, Read, Update, Delete) Operations 
*/ 

// Adding new contact 
void addContact(Contact contact) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, contact.getName()); // Contact Name 
    values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone 

    // Inserting Row 
    db.insert(TABLE_CONTACTS, null, values); 
    db.close(); // Closing database connection 
} 


// Getting All Contacts 
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; 
} 

と私のアダプタクラスがあるのgetViewメソッド()メソッドです。実際のデータは、14件のレコードを含むが、最後の4 GetViewメソッドは、画面をレンダリングする必要があるときに呼び出されるメソッドである

+0

に適していますが示すことができますgetCount()メソッドどのくらいのレコードを表示するか、またgetview呼び出しごとに、新しいレコードを追加することをお勧めします。 –

+0

public int getCount(){ 戻り値dataList.size(); } –

+0

個は一致しますが、最後の4個のフィールドは最初に置換されます4 –

答えて

1

来ていないenter image description here

よう

public View getView(int i, View view, ViewGroup viewGroup) { 
    view = inflater.inflate(R.layout.single_item,null); 
    TextView tvName = (TextView)view.findViewById(R.id.txtName); 
    TextView tvMobile = (TextView)view.findViewById(R.id.txtPhone); 
    DatabaseHandler db = new DatabaseHandler(activity); 
    db.addContact(new Contact(dataList.get(i).getName(),dataList.get(i).getPhoneNumber())); 
    List<Contact> contacts = db.getAllContacts(); 
    Log.d("contacts",contacts.get(i).getName()+""); 
    tvName.setText(contacts.get(i).getName()); 
    tvMobile.setText(contacts.get(i).getPhoneNumber()); 
    return view; 
} 

logcat応答であります。したがって、getViewメソッドは複数回呼び出すことができます。このため、このメソッドの外部でデータベース操作を行う必要があります。あなたの活動のクラスで例えば

... 
    contactListView (ListView)findViewById(R.id.lv_contacts_container);<-- your xml 
    contactList = db.getAllContacts(); 
    adapter = new ContactListViewAdapter(this, contactList); 
    contactListView.setAdapter(adapter); 

    contactListView.setOnItemClickListener(new 
    AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 

      //Selected contact entity 
      ContactEntity entity = adapter.getData().get(position); 
      ... 
     } 

    }); 

と単にあなたのアダプタクラスは次のように次のようになります。

public class ContactListViewAdapter extends BaseAdapter { 

Context context; 
LayoutInflater inflater; 
private List<ContactEntity> contactList; 

public ContactListViewAdapter(Context context, List<ContactEntity> contactList) { 
    this.context = context; 
    this.contactList = new ArrayList<>(); 
    this.contactList.addAll(contactList); 
} 

@Override 
public int getCount() { 
    return contactList.size(); 
} 

public List<ContactEntity> getData() { 
    return this.contactList; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ContactRowViewHolder holder; 
    if (convertView == null) { 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.contact_list_row, parent, false); <--your row xml 
     holder = new ContactRowViewHolder(); 
     holder.contactNameTextView = (TextView) convertView.findViewById(R.id.contact_text); <-- your text view in row 
     convertView.setTag(holder); 
    } else { 
     holder = (ContactRowViewHolder) convertView.getTag(); 
    } 

    ContactEntity contact = contactList.get(position); 
    if (contact == null || contact.getContactName() == null) { 
     // error log 
    } 
    holder.contactNameTextView.setText(contact.getContactName()); 
    return convertView; 
} 

static class ContactRowViewHolder { 
    private TextView contactNameTextView; 
} 
} 

注:ホルダーパターンが長いリスト

+0

どうすれば外部getView()メソッドを追加できますか? –

+0

お世話になりました...外部getview()を追加することで問題が解決しました –

+0

あなたは歓迎です:それは受け入れられた答えとして確認できますか? – missionMan

関連する問題