2014-07-11 254 views
-3

我不知道如何做到这一点...请帮助! 我已经将所有设置都设置为现在添加运动员姓名,年龄,层级和日期添加到数据库。我希望将这些运动员添加到列表视图中,并且能够点击该名称以打开稍后将创建的另一个活动。我主要只是想从数据库中将这些名称添加到列表视图中,但不知道如何。我试图使用适配器,但没有成功。Android:如何在ListView中显示数据库数据?

public void onClick_btnDisplayList(View view) { 
    // What do I put in this to display what is in my database 
} 

onCreate方法:

DatabaseHandler db = new DatabaseHandler(this); 
ListView listView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_add_user); 

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


} 

添加到数据库的方法:

所有你需要为此创建一个 定义适配器
public void onClick_btnAddAthlete(View view) { 
    DatabaseHandler db = new DatabaseHandler(this); 
    EditText editName = (EditText) findViewById(R.id.editName); 


    Log.d("Insert: ", "Inserting .."); 
    db.addContact(new Athlete("Ravi", "20", "2", "10/12/13")); 
    db.addContact(new Athlete("Srinivas", "23", "4", "4/2/12")); 
    db.addContact(new Athlete("Tommy", "43", "1", "7/11/14")); 
    db.addContact(new Athlete("Karthik", "6", "3", "1/3/12")); 

    // Reading all contacts 
    Log.d("Reading: ", "Reading all contacts.."); 
    List<Athlete> athletes = db.getAllAthletes(); 

    for (Athlete cn : athletes) { 
     String log = "Id: " + cn.getID() + " ,Name: " + cn.getName() + " ,Phone: " + cn.getAge() + 
       " ,Tier: " + cn.getTier() + " ,Date: " + cn.getDate(); 
     // Writing Contacts to log 
     Log.d("Name: ", log); 
    } 
} 
+0

你说使用阵列适配器不起作用?什么不起作用?因为这对我来说似乎是最好的解决方案。 – RScottCarson

+0

我99%确定你必须使用适配器与ListViews。我会建议创建一个适配器类并使用它。当我有机会时,我可以尝试打字。 – zgc7009

+0

我该怎么做? – user3830363

回答

0
  1. 第一。
  2. 然后,你需要查询数据库用于获取记录。(使用AsyncTask
  3. 创建Athlete类的ArrayList和存储从那里分贝值。
  4. 最后将此列表设置为您的自定义适配器。

Creating a Custom Adapter

0

我将在此更延长一些,当我得到一个机会,但

public class MyCustomAdapter extends BaseAdapter{ 

    private Context context; 
    private List<Athlete> athletes; 

    public MyCustomAdapter(Context context, List athletes){ 
     this.context = context; 
     this.athletes = athletes; 
    } 

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

    @Override 
    public Athlete getItem(int position){ 
     return athletes.get(position); 
    } 

    @Override 
    public int getItemId(int position){ 
     return position; 
    } 

    @Override 
    public void getView(int position, View convertView, ViewGroup parent){ 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     convertView = inflater.inflate(R.layout.list_item_layout_name, parent, false); 

     // Get views with something like 
     // TextView text = (TextView) convertView.findViewById(R.id.text_view_name); 

     Athlete currAthlete = getItem(position); 

     // Do what you want with your athlete, like 
     // text.setText(currAthlete.getName()); 
    } 
} 

然后在你的活动

listView.setAdapter(new MyCustomAdapter(this, athletes)); 

这不是一个完整的答案,但对于评论太长了,我现在没有时间来完成它。它应该给你一个如何使用适配器的想法。

0

你在这里要求的实际上是一个完整的应用程序。我的意思不是吓唬你,但你需要退后一步,记得面向对象编程(OOP):

  • 你需要一个运动员类与所有你想要显示的运动员的数据;你似乎已经有了。太好了。

  • 您需要一个从数据库中获取数据到ArrayList的类:ArrayList<Athlete> mAthletes;因此,这个类应该有一个从db中获取数据的方法。在这种方法中,您需要一个匿名asyncTask,它将为您填充mAthlete字段。称这个类为AthleteLoader。运动员装载者应该扩展Observable,以便在数据加载时告诉Activity。根据您的设计,您的活动类应在onCreateonResume内调用此方法。你也可能希望在方法中放置一个检查,以便它只在ArrayList为空时查询数据库。再次,你根据你的设计来决定。

  • 在您的Activity类中,您需要实现Observer,以便当数据从AthleteLoader准备就绪时,您可以拨打notifyObservers()来广播信息。

  • 在您的活动类中,在update方法内(由于Observer),通过在适配器上调用notifyDataSetChanged将数据传递给适配器。

  • 在适配器内部,您需要从班级AthleteLoader中获取每个运动员。有很多方法可以做到这一点。一种方法是简单地将mAthletes放在适配器中,放在AthleteLoader中。所以,当数据存在时,它就在那里(原谅重言式,但在这里我假设你理解OOP和java中的指针)。这样从活动到notifyDataSetChanged的呼叫就足够了。

  • 此外,适配器应该扩展基本适配器,以便所有方法都使用mAthletes填充。因此,例如,getItem应该简单地return mAthletes.get(location);

如果你是一个真正的新手,这绝对是一个很大的信息。但是,你再次要求这个简单的问题提供很多帮助。祝你好运,我希望你能用这份名单来指导你的追求。

相关问题