2015-11-01 3 views
3

Я делаю простое приложение для Android, которое берет имя, адрес электронной почты и контактный номер пользователя и сохраняет их (включая идентификатор) в памяти телефона (через sqlite). На странице «Показать все» отображаются все данные пользователя в базе данных в ListView с использованием пользовательского адаптера. Она работает так:Как настроить адаптер на Android?

The "Show All" Page

Он оставляет эти пространства между рядами. Как удалить эти пробелы? Кроме того, детали загружаются при извлечении из базы данных. Как и первая строка отображается в правильном формате (как я и хотел). Но детали второго перепутались. Как это исправить?

MyDBHandler.java

public class MyDBHandler extends SQLiteOpenHelper{ 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME= "user.db"; 
    public static final String TABLE_NAME = "data"; 
    public static final String COLUMN_ID = "id"; 
    public static final String COLUMN_NAME = "name"; 
    public static final String COLUMN_email = "email"; 
    public static final String COLUMN_phno = "phno"; 

    public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
     super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     String query = "CREATE TABLE "+TABLE_NAME+"("+ 
       COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"+ 
       COLUMN_NAME + " VARCHAR(20),"+ 
       COLUMN_email + " VARCHAR(20),"+ 
       COLUMN_phno + " VARCHAR(20)"+ 
       ");"; 

     db.execSQL(query); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 


     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     onCreate(db); 
    } 

    public void addData(Data d){ 
     ContentValues values = new ContentValues(); 
     //values.put(COLUMN_ID, d.getId()); 
     values.put(COLUMN_NAME, d.getName()); 
     values.put(COLUMN_email, d.getEmail()); 
     values.put(COLUMN_phno, d.getPhno()); 

     SQLiteDatabase db = getWritableDatabase(); 
     db.insert(TABLE_NAME, null, values); 
     db.close(); 
    } 

    public ArrayList<String> retrieveData(){ 

     ArrayList<String> al = new ArrayList<>(); 

     SQLiteDatabase db = getWritableDatabase(); 
     String query = "SELECT * FROM "+TABLE_NAME+";"; 

     Cursor c = db.rawQuery(query,null); 

     c.moveToFirst(); 

     while(!c.isAfterLast()){ 
      if(c.getString(c.getColumnIndex("id"))!=null){ 

       al.add(c.getString(c.getColumnIndex("id"))); 
       al.add(c.getString(c.getColumnIndex("name"))); 
       al.add(c.getString(c.getColumnIndex("email"))); 
       al.add(c.getString(c.getColumnIndex("phno"))); 

      } 
      c.moveToNext(); 
     } 
     db.close(); 
     return al; 

    } 

} 

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<String>{ 


    ArrayList<String>a = new ArrayList<>(); 


    public CustomAdapter(Context context, ArrayList<String>a){ 
     super(context,R.layout.custom_row,a); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     LayoutInflater harshitsInflator = LayoutInflater.from(getContext()); 
     View customView = harshitsInflator.inflate(R.layout.custom_row, parent, false); 

     TextView textView3 = (TextView) customView.findViewById(R.id.textView3); 
     TextView textView4 = (TextView) customView.findViewById(R.id.textView4); 
     TextView textView5 = (TextView) customView.findViewById(R.id.textView5); 
     Button button4 = (Button) customView.findViewById(R.id.button4); 

     String Sid = getItem(position); 

     if(position%4==0 && position>0) 
     { 
      textView3.setText(a.get(1)); 
      textView4.setText(a.get(2)); 
      textView5.setText(a.get(3)); 
      button4.setText(a.get(0)); 
      a.clear(); 
      customView.setVisibility(View.VISIBLE); 
     } 
     else { 
      a.add(Sid); 
      customView.setVisibility(View.GONE); 
     } 
     return customView; 
    } 
} 

listView.java

public class listView extends Activity { 

    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.list_view_layout); 

     ArrayList<String> n; 


     MyDBHandler db = new MyDBHandler(this, null, null, 1); 

     n=db.retrieveData(); 

     ListAdapter harshitsAdapter = new CustomAdapter(this, n); 

     ListView harshitsListView = (ListView) findViewById(R.id.harshitsListView); 
     harshitsListView.setAdapter(harshitsAdapter); 
     //((BaseAdapter)harshitsAdapter).notifyDataSetChanged(); 




    } 

    public void backToMain(View view){ 

     Intent i = new Intent(this, MainActivity.class); 
     startActivity(i); 
     finish(); 
    } 
} 

Это приложение также показывает ArrayIndexOutOfBounds Exception:

Process: com.example.h8pathak.dilliheart, PID: 21258 
    java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3 
      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
      at java.util.ArrayList.get(ArrayList.java:308) 

Как мне исправить это?

+0

Используйте длину списка, чтобы проверить границы, чтобы вы не встречались с таким исключением –

+0

Попробуйте usiong Длина, упомянутая @StanlyMoses или почему бы не написать собственный RecyclerViewAdapter вместо этого? – sud007

+0

Я не вижу цели arraylist 'a'. И если это список, который также хранит ваши данные, то вы очищаете его во время 'getView()'. Вы не можете изменять данные, которые используются для отображения вашего представления. – Droidekas

ответ

-1

Измените эти два файла из ваших:

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<String>{ 

    ArrayList<String> id, name, email, phno; 
    Context c; 


    public CustomAdapter(Context context, ArrayList<String>id, ArrayList<String>name , ArrayList<String>email , ArrayList<String> phno){ 
     super(context,R.layout.custom_row, id); 

     this.c=context; 
     this.id = id; 
     this.name=name; 
     this.email=email; 
     this.phno=phno; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     LayoutInflater harshitsInflator = LayoutInflater.from(getContext()); 
     View customView = harshitsInflator.inflate(R.layout.custom_row, parent, false); 

     TextView textView3 = (TextView) customView.findViewById(R.id.textView3); 
     TextView textView4 = (TextView) customView.findViewById(R.id.textView4); 
     TextView textView5 = (TextView) customView.findViewById(R.id.textView5); 
     Button button4 = (Button) customView.findViewById(R.id.button4); 


      String Sid = id.get(position); 
      String Sname = name.get(position); 
      String Semail = email.get(position); 
      String Sphno = phno.get(position); 

      textView3.setText(Sname); 
      textView4.setText(Semail); 
      textView5.setText(Sphno); 
      button4.setText(Sid); 

     return customView; 
    } 
} 

listView.java

public class listView extends Activity { 

    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.list_view_layout); 

     ArrayList<String> n; 
     ArrayList<String> id = new ArrayList<>(); 
     ArrayList<String> name = new ArrayList<>(); 
     ArrayList<String> email = new ArrayList<>(); 
     ArrayList<String> phno = new ArrayList<>(); 

     MyDBHandler db = new MyDBHandler(this, null, null, 1); 

     n=db.retrieveData(); 

     for(int i =0; i<n.size();i++){ 
      if(i%4==0) 
       id.add(n.get(i)); 
      else if (i%4==1) 
       name.add(n.get(i)); 
      else if (i%4==2) 
       email.add(n.get(i)); 
      else 
       phno.add(n.get(i)); 
     } 

     System.out.println(n); 


     ListAdapter harshitsAdapter = new CustomAdapter(this, id, name, email, phno); 

     ListView harshitsListView = (ListView) findViewById(R.id.harshitsListView); 
     harshitsListView.setAdapter(harshitsAdapter); 




    } 

    public void backToMain(View view){ 

     Intent i = new Intent(this, MainActivity.class); 
     startActivity(i); 
     finish(); 
    } 





} 

Адаптирование этот метод также не приведет вас к «ArrayIndexOutOfBounds "Исключение

+1

@ TheHardRock Спасибо, этот метод действительно сработал :) – h8pathak

0

Итак, сохраните все данные в классе модели Data и добавьте объект Data в ListView. Измените метод базы данных, чтобы получить все данные, подобные этому

public ArrayList<Data> retrieveData(){ 

     ArrayList<Data> al = new ArrayList<>(); 

     SQLiteDatabase db = getWritableDatabase(); 
     String query = "SELECT * FROM "+TABLE_NAME+";"; 

     Cursor c = db.rawQuery(query,null); 

     c.moveToFirst(); 

     while(!c.isAfterLast()){ 
      if(c.getString(c.getColumnIndex("id"))!=null){ 

       Data dt = new Data(); 
       dt.setId(c.getString(c.getColumnIndex("id"))); 
       dt.setName(c.getString(c.getColumnIndex("name"))); 
       dt.setEmail(c.getString(c.getColumnIndex("email"))); 
       dt.setPhno(c.getString(c.getColumnIndex("phno"))); 

       al.add(dt); 

      } 
      c.moveToNext(); 
     } 
     db.close(); 
     return al; 

    } 

Извлечь данные с использованием метода геттера. надежда может работать на вас.

0

Прежде всего, я должен создать объект Value для работы. Например:

public class UserVO { 

    private long id; 
    private String name, 
        email, 
        contactNumber; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getContactNumber() { 
     return contactNumber; 
    } 

    public void setContactNumber(String contactNumber) { 
     this.contactNumber = contactNumber; 
    } 

} 

Затем вы можете использовать его в свои классы, как следующее:

public class CustomAdapter extends ArrayAdapter<UserVO>{ 

    private UserVO mUser; 
    private Context mContext; 
    private LayoutInflater mLayoutInflater; 
    private ViewHolder mHolder; 

    public CustomAdapter(Context context, UserVO user){ 

     mContext = context; 
     mUser = user; 

    } 

    static class ViewHolder { 

     private TextView textView3, 
         textView4, 
         textView5; 

    } 

    @Override 
    public View getView(int position, View view, ViewGroup parent) { 

     if (view == null) { 

      view = layoutInflater.inflate(R.layout.custom_row, parent, false); 

      mHolder = new ViewHolder(); 

      mHolder.textView3 = (TextView) view.findViewById(R.id.textView3); 
      mHolder.textView4 = (TextView) view.findViewById(R.id.textView4); 
      mHolder.textView5 = (TextView) view.findViewById(R.id.textView5); 

      view.setTag(mHolder); 

     } 
     else { 

      mHolder = (ViewHolder) view.getTag(); 

     } 

     mUser = getItem(position); 

     mHolder.textView3.setText(mUser.getId()); 
     mHolder.textView4.setText(mUser.getEmail()); 
     mHolder.textView5.setText(mUser.getContactNumber()); 

     return view; 
    } 

} 

в вашем MyDBHandler вам не нужно, чтобы переместить курсор на первую позицию. Это может быть ошибка исключения, о которой вы говорили.Кроме того, вы также можете вернуть список пользователей, как:

public ArrayList<UserVO> retrieveData(){ 

    ArrayList<UserVO> userList = new ArrayList<>(); 

    SQLiteDatabase db = getWritableDatabase(); 
    String query = "SELECT * FROM " + TABLE_NAME + ";"; 

    Cursor c = db.rawQuery(query, null); 

    while(c.moveToNext()) { 

     if(c.getString(c.getColumnIndex("id")) != null) { 

      UserVO _user = new UserVO(); 

      _user.setId(c.getLong(c.getColumnIndex("id"))); 
      _user.setName(c.getString(c.getColumnIndex("name"))); 
      _user.setEmail(c.getString(c.getColumnIndex("email"))); 
      _user.setContactNumber(c.getString(c.getColumnIndex("phno"))); 

      userList.add(_user); 

     } 

    } 

    db.close(); 

    return userList; 

} 

И, наконец, вы можете загрузить ListView:

public class listView extends Activity { 

    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.list_view_layout); 

     ArrayList<UserVO> userList; 


     MyDBHandler db = new MyDBHandler(this, null, null, 1); 

     userList = db.retrieveData(); 

     ListAdapter harshitsAdapter = new CustomAdapter(this, userList); 

     ListView harshitsListView = (ListView) findViewById(R.id.harshitsListView); 

     harshitsListView.setAdapter(harshitsAdapter); 

    } 

    public void backToMain(View view){ 

     Intent i = new Intent(this, MainActivity.class); 
     startActivity(i); 
     finish(); 
    } 

} 

Эти классы являются лишь примерами. И вам придется что-то редактировать, чтобы заставить его работать, проклятия. Во всяком случае, не стесняйтесь спрашивать, что хотите.

Смежные вопросы