2016-06-07 1 views
0

Я хочу получить данные из двух полей из базы данных preopulate sqlite. Полями являются название организации (org_name) и контактный номер (contact_no). После этого мне нужно назначить данные org_name большому текстовому полю и contact_no в маленькое текстовое поле в моем пользовательском списке.Как получить два поля из preopulate sqlite db и назначить его пользовательскому списку?

Я пробовал это только с одним полем. Он работает нормально. Но когда я пытаюсь получить два поля, он не работает. Это то, что я пробовал. Пожалуйста, помогите мне решить эту проблему.

ContactView класс

public class ContactView extends Activity { 
private ListView listView; 
private ListView listView1; 
List<Organization> rowItems; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list_view); 



    DBAccess databaseAccess = DBAccess.getInstance(this); 
    databaseAccess.open(); 
    List<String> quotes = databaseAccess.getQuotes(getIntent().getStringExtra("ID_EXTRA")); 
    databaseAccess.close(); 


    List<Organization> rowItem=new ArrayList<Organization>(); 
    for(String quote:quotes){ 
     Organization temp=new Organization(quote); 
     rowItem.add(temp); 
    } 
    listView = (ListView)findViewById(R.id.listView); 
    CustomListViewAdapter adapter = new CustomListViewAdapter(this, 
      R.layout.single_row_item, rowItem); 
    listView.setAdapter(adapter); 



} 

Класс доступа к базе данных

public class DBAccess { 
private SQLiteOpenHelper openHelper; 
private SQLiteDatabase database; 
private static DBAccess instance; 
String passedVar = null; 
private ListView listView; 

public DBAccess(Context context) { 

    this.openHelper = new HelloDatabase(context); 
} 

public static DBAccess getInstance(Context context) { 
    if (instance == null) { 
     instance = new DBAccess(context); 
    } 
    return instance; 
} 

public void open() { 
    this.database = openHelper.getWritableDatabase(); 
} 

public void close() { 
    if (database != null) { 
     this.database.close(); 
    } 
} 

public List<String> getQuotes(String id) { 
    List<String> list = new ArrayList<>(); 
    Integer value; 


    if (id != null) { 
     Cursor cursor = database.rawQuery("SELECT org_name,contact_no FROM org_name WHERE category_id = \"" + id + "\"", null); 


     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      list.add(cursor.getString(0)); 
      list.add(cursor.getString(cursor.getColumnIndex("contact_no"))); 
      cursor.moveToNext(); 

     } 

     cursor.close(); 


    } 


    return list; 
}} 

Bean класс

public class Organization { 

    public String title; 
    public String telenum; 

    public Organization(String title,String telenum) { 

     this.title = title; 
     this.telenum=telenum; 

    } 

    public String getTitle() { 

     return title; 
    } 
    public void setTitle(String title) { 

     this.title = title; 
    } 

    public String getTelenum(){ 
     return telenum; 
    } 

    public void setTelenum(String telenum){ 
     this.telenum=telenum; 
    } 

} 

CustomListViewAdapter класс

public class CustomListViewAdapter extends ArrayAdapter<Organization> { 

Context context; 

public CustomListViewAdapter(Context context, int layout, 
          List<Organization> items) { 
    super(context, layout, items); 
    this.context = context; 
} 

/*private view holder class*/ 
private class ViewHolder { 

    TextView txtTitle; 
    TextView txtTele; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    Organization rowItem = getItem(position); 

    LayoutInflater mInflater = (LayoutInflater) context 
      .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.single_row_item, null); 
     holder = new ViewHolder(); 

     holder.txtTitle = (TextView) convertView.findViewById(R.id.org_name); 
     holder.txtTele = (TextView) convertView.findViewById(R.id.tele_num); 

     convertView.setTag(holder); 


    } else 
     holder = (ViewHolder) convertView.getTag(); 


    holder.txtTitle.setText(rowItem.getTitle()); 
    holder.txtTele.setText(rowItem.getTelenum()); 

    return convertView; 
}} 
+0

просто использовать 'SimpleCursorAdapter' – pskink

+0

Это также работает с одним полем. Если вы можете мне помочь с этим кодом – venura

+0

Как вы создаете 'SimpleCursorAdapter'? – pskink

ответ

1

Примечание: Если кто-либо сталкивается с той же проблемой, пожалуйста, используйте SimpleCursorAdapter. Его простой, простой в использовании и эффективный. Найти простой пример here или проверка моего ответа на эту тему https://stackoverflow.com/a/37560755/5460053


Это не работает для двух полей из-за следующие строки в getQuotes() метод класса DBAccess:

cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     list.add(cursor.getString(0));//Adding org_name first. org_name is added at indexes : 0,2,4,... 
     list.add(cursor.getString(cursor.getColumnIndex("contact_no")));//Then adding contact_no. contact_no is added at indexes : 1,3,5,... 
     cursor.moveToNext(); 

    } 

Затем, создание источника данных для адаптера, ORG_NAME и contact_no добавлены в альтернативных индексов

List<Organization> rowItem=new ArrayList<Organization>(); 
    for(String quote:quotes){ 
     Organization temp=new Organization(quote);//I wonder how this worked as there is only one contructor for Organization which is expecting 2 parameters 
     rowItem.add(temp); 
    } 

Изменить класс DBAccess GE tQuotes() к этому:

public List<Organization> getQuotes(String id) { 
    List<Organization> list = new ArrayList<>(); 

    if (id != null) { 
     Cursor cursor = database.rawQuery("SELECT org_name,contact_no FROM org_name WHERE category_id = \"" + id + "\"", null); 

     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      Organization org = new Organization(cursor.getString(0), 
       cursor.getString(cursor.getColumnIndex("contact_no"))); 
       list.add(org); 
      cursor.moveToNext(); 
     } 

     cursor.close(); 
    } 
    return list; 
} 

И изменить OnCreate вашей ContactView активность (в) к этому:

public class ContactView extends Activity { 
private ListView listView; 
private ListView listView1; 
List<Organization> rowItems; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list_view); 

    DBAccess databaseAccess = DBAccess.getInstance(this); 
    databaseAccess.open(); 
    List<Organization> rowItem = databaseAccess.getQuotes(getIntent().getStringExtra("ID_EXTRA")); 
    databaseAccess.close(); 

    listView = (ListView)findViewById(R.id.listView); 
    CustomListViewAdapter adapter = new CustomListViewAdapter(this, 
      R.layout.single_row_item, rowItem); 
    listView.setAdapter(adapter); 



} 
+0

Большое спасибо. Он работает, и я многому научился. Еще раз спасибо. – venura

+0

@venura: Отлично! Я бы сказал, что вы должны переключиться на использование 'SimpleCursorAdapter'. Он прост в использовании, легко понятен, эффективен и с минимальными строками кода. Вернее, вы должны попробовать и посмотреть разницу между двумя способами. Как только вы его используете, оно будет самоочевидным. Если вы не найдете это полезным, вам пригодится, поскольку вы будете знать два способа сделать то же самое. –

+0

Monish Kamble, вы должны были сказать, что в своем ответе вместо исправления неисправного кода OP я боюсь, что @venura все равно будет использовать подход «ArrayAdapter», поскольку он работал на него ... – pskink

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