【问题标题】:ListView on Android - Populating with an ArrayListAndroid 上的 ListView - 使用 ArrayList 填充
【发布时间】:2013-04-22 18:42:40
【问题描述】:

我正在尝试通过 AsyncTask 使用 SQL 语句和 jTDS 驱动程序在 Android 上的 ListView 中显示行。

Articles.java:

package com.example.projectmanager;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import android.os.AsyncTask;
import android.util.Log;


public class Articles extends AsyncTask <List<Articles>, Void, List> {

    int article_id;
    String title; 
    String body ;
    Date date;
    String username;
    List<Articles> posts = new ArrayList<Articles>();


    protected List<Articles> doInBackground(List... params) {

         Connection conn = null;
            try {   



            String driver = "net.sourceforge.jtds.jdbc.Driver";
            Class.forName(driver).newInstance();

            String connString = "jdbc:jtds:sqlserver://10.0.2.2/master_db;";
            String sqlusername = "admin";
            String sqlpassword = "root";

            conn = DriverManager.getConnection(connString, sqlusername, sqlpassword);
            Log.w("Connection","open");

            String articleQuery = "SELECT TOP 5 E.article_id,E.article_title,E.article_description,E.article_date,u.username FROM articles AS E INNER JOIN user_articles as A ON A.article_id = E.article_id INNER JOIN users as u ON A.user_id = u.user_id WHERE E.article_status = 1;"; 

            PreparedStatement stmt = conn.prepareStatement(articleQuery);

            ResultSet rs;

            rs = stmt.executeQuery();



            while (rs.next()) {

                Articles article = new Articles();
                article.article_id = rs.getInt("article_id");
                article.username = rs.getString("username");
                article.date = rs.getDate("article_date");
                article.title = rs.getString("article_title");
                article.body = rs.getString("article_description");
                posts.add(article);             


            }
            conn.close();

            } catch (Exception e)
            {
            Log.w(e.getMessage(), e);
            }


        return posts;



    }
    protected void onPostExecute(List posts) {
        // Result is here now, may be 6 different List type.
        this.posts = posts; 
    }




}

HomeActivity.java:

package com.example.projectmanager;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutionException;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class HomeActivity extends Activity {

    @SuppressWarnings("unchecked")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);


        Articles a = new Articles();

        ListView lv = (ListView) findViewById(R.id.lvPosts);
        List postsList = null;

        try {
            postsList = new Articles().execute().get();
        } catch (InterruptedException e) {

            e.printStackTrace();

        } catch (ExecutionException e) {

            e.printStackTrace();
        }


        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, postsList);
        lv.setAdapter(arrayAdapter); 


    }


      }

每当我尝试运行代码时,我都会得到以下输出:

LogCat:http://pastebin.com/cjm1BNeZ

谁能告诉我这是怎么回事?

更新:填充数组列表

String articleQuery = "SELECT TOP 5 E.article_id,E.article_title,E.article_description,E.article_date,u.username FROM articles AS E INNER JOIN user_articles as A ON A.article_id = E.article_id INNER JOIN users as u ON A.user_id = u.user_id WHERE E.article_status = 1;"; 

            PreparedStatement stmt = conn.prepareStatement(articleQuery);

            ResultSet rs;

            rs = stmt.executeQuery();



            while (rs.next()) {

                Articles article = new Articles();
                article.article_id = rs.getInt("article_id");
                article.username = rs.getString("username");
                article.date = rs.getDate("article_date");
                article.title = rs.getString("article_title");
                article.body = rs.getString("article_description");
                posts.add(article);             


            }

【问题讨论】:

  • 您需要在 Articles 类中覆盖 toString()
  • 需要将List转成字符串数组
  • 要提供更多详细信息,我们需要知道您的List 是如何被new Articles().execute().get() 返回的;已填充。
  • @Code-Guru 它是 Articles 中 doInbackground() 的返回值。它填充在 Articles 类中(请参阅更新的问题)
  • IMO,您应该将ListArticles 类分开,并将Articles 重命名为Article。换句话说,您可以创建一个类来存储single 文章的数据。一些 other 类应该负责从某个数据源(可能是数据库表?)构建文章列表。这种分离将使调试和维护您的项目更加更容易。

标签: android sql arraylist android-listview android-asynctask


【解决方案1】:

将此添加到您的文章类:

        @Override
        public String toString() {
            return "id: "+article_id + "\n"
                   +"title : " + title 
                   +"body: "+body ;
        }

或您希望用户看到的任何其他信息。
这是因为 Android 框架会调用 YOUROBJECT.toString();自动渲染列表中的对象。这就是为什么你需要重写这个方法。

更新:

Articles article = new Articles();
                article.article_id = rs.getInt("article_id");
                article.username = rs.getString("username");
                article.date = rs.getDate("article_date");
                article.title = rs.getString("article_title");
                article.body = rs.getString("article_description");

这是您填充文章对象的代码。如果您想在您的项目列表中显示此对象的其他属性。只需在 toString() 方法中添加字段。 例如:

  @Override
        public String toString() {
            return "id: "+article_id + "\n"
                   +"title : " + title 
                   +"body: "+body+" date"+date +"username: "+username ;
        }

【讨论】:

  • 我怎样才能从 SQL 查询中输出所有值?
  • @Brian 由于您的数据来自数据库,因此您应该考虑使用 SimpleCursorAdapter 而不是 ArrayAdapter。一个优点是它可以很容易地将每个项目放在它自己的 TextView 中。这样,您可以在 ListView 中添加带有标题的列,而不是在每一行中重复“id:”、“title:”等标签。
【解决方案2】:

我认为您使用 ArrayAdapter 错误。 你输入的类型 (String) 不是你应该输入的类型。

您需要创建新的自定义数组适配器,该适配器接受类型 Articles 和 再做一次。

类似:

    public class ListAdapter extends ArrayAdapter<Articles> {

public ListAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
    // TODO Auto-generated constructor stub
}

private List<Articles> items;

public ListAdapter(Context context, int resource, List<Articles> items) {

    super(context, resource, items);

    this.items = items;

}

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

    View v = convertView;

    if (v == null) {

        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        v = vi.inflate(R.layout.itemlistrow, null);

    }

    Item p = items.get(position);

    if (p != null) {

        TextView tt = (TextView) v.findViewById(R.id.id);
        TextView tt1 = (TextView) v.findViewById(R.id.categoryId);
        TextView tt3 = (TextView) v.findViewById(R.id.description);

        if (tt != null) {
            tt.setText(p.userName());
        }
        if (tt1 != null) {

            tt1.setText(p.getDate);
        }
        //and so on...
    }

    return v;

}

您应该将您的观点与您的文章对象联系起来。查看属性。 这就是适配器的含义。而字符串适配器仅适用于字符串列表。

之后你应该这样做:

ListAdapter<Articles> arrayAdapter = new ListAdapter<Articles>(this,android.R.layout.simple_list_item_1, postsList);
    lv.setAdapter(arrayAdapter); 

希望对你有帮助。

【讨论】:

    【解决方案3】:

    看来Articles.execute().get() 方法返回了ListArticles 对象。 ArrayListAdapter 调用这些对象的toString() 方法。如果您不提供自己的toString() 方法,您只需从Object 继承默认的方法,它会打印出对象的类名和哈希值。这就是输出如您所见的原因。

    解决此问题的一种方法是覆盖Articles 类中的toString() 方法,以返回您希望在ListView 中显示的数据的String 表示。

    【讨论】:

      【解决方案4】:

      Follow this instructions 获取自定义 adpater 示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多