【问题标题】:sqlite database and listviewsqlite 数据库和列表视图
【发布时间】:2014-01-16 15:10:22
【问题描述】:

好的,我已经在这里搜索过,并没有找到我的答案。我的 android 应用程序应该做的是从我的 php 和 mysql 服务器获取一个列表,然后将其存储在手机上的数据库中。这一切都有效,我什至可以使用我的 sqlite db 中的信息创建一个列表视图。作为一个新编码员,我正试图弄清楚如何在他们单击列表视图项时显示信息,这将把他们带到另一个页面,该页面将显示该列表视图的所有详细信息。

简而言之,我想要的是拥有我的列表视图,例如项目 1、项目 2、项目 3,然后当他们单击项目 2 时,它会获取项目 2 的信息并显示它。有人能指出我正确的方向吗,我知道我必须使用 setOnClickListener,但只是不确定如何让它寻找那个特定的项目。

public class Events extends Activity 
{   
// Identifies a particular Loader being used in this component
String event_name, event_time, event_price, event_loc;
static JSONObject object =null;

DBAdapter myDb;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.events);

    openDB();
    new PrefetchData().execute();

    // used to refresh my page.
    Button button = (Button) findViewById(R.id.refresh);

    button.setOnClickListener(new OnClickListener()
    {
      public void onClick(View v)
      {
          openDB();
          new PrefetchData().execute();
      }
    });
}

@Override
protected void onDestroy() 
{
    super.onDestroy();  
    closeDB();
}

private void openDB() 
{
    myDb = new DBAdapter(this);
    myDb.open();
}
private void closeDB() 
{
    myDb.close();
}

private class PrefetchData extends AsyncTask<Void, Void, Void> 
{

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();      
    }

    @Override
    protected Void doInBackground(Void... arg0) 
    {
        myDb.deleteAll();
        JsonParser jsonParser = new JsonParser();
        String json = jsonParser.getJSONFromUrl("http://www.website.com/test.json");

        Log.e("JSON Response: ", "> " + json);

        if (json != null) 
        {
            try 
            {
                JSONObject parent = new JSONObject(json);
                JSONArray eventDetails = parent.getJSONArray("event");

                for(int i=0; i < eventDetails.length(); i++)
                {
                    object = eventDetails.getJSONObject(i);
                    event_name = object.getString("event_name");
                    event_time = object.getString("event_time");
                    event_price = object.getString("event_price");
                    event_loc = object.getString("event_loc");
                    //event_pic = object.getString("event_pic");

                    myDb.insertRow(event_name,event_time,event_price,event_loc);

                    Log.e("JSON", "> " + event_name + event_time + event_price + event_loc );
                }
            } catch (JSONException e) 
                {
                // TODO Auto-generated catch block
                Log.e("Json Error", "Error: " + e.toString());
                    e.printStackTrace();
                }
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) 
    {           
        super.onPostExecute(result);
        populateListViewFromDB();
        myDb.close();
        // After completing http call
        // will close this activity and lauch main activity
        //Intent i = new Intent(MainActivity.this, Events.class);
        //i.putExtra("event_name", event_name);
        //i.putExtra("event_time", event_time);
        //i.putExtra("event_price", event_price);
        //startActivity(i);

        // close this activity
        //finish();
    }

}

@SuppressWarnings("deprecation")
private void populateListViewFromDB() 
{
    Cursor cursor = myDb.getAllRows();

    // Allow activity to manage lifetime of the cursor.
    // DEPRECATED! Runs on the UI thread, OK for small/short queries.
    startManagingCursor(cursor);

    // Setup mapping from cursor to view fields:
    String[] fromFieldNames = new String[] 
            {DBAdapter.KEY_NAME, DBAdapter.KEY_TIME, DBAdapter.KEY_PRICE, DBAdapter.KEY_LOC};
    int[] toViewIDs = new int[]
            {R.id.item_name};//,     R.id.item_time};//,           R.id.item_price,     R.id.item_loc};

    // Create adapter to may columns of the DB onto elemesnt in the UI.
    SimpleCursorAdapter myCursorAdapter = 
            new SimpleCursorAdapter(
                    this,       // Context
                    R.layout.item_layout,   // Row layout template
                    cursor,                 // cursor (set of DB records to map)
                    fromFieldNames,         // DB Column names
                    toViewIDs               // View IDs to put information in
                    );

    // Set the adapter for the list view
    ListView myList = (ListView) findViewById(R.id.listViewfordb);
    myList.setAdapter(myCursorAdapter);
}

}

【问题讨论】:

    标签: android sqlite listview android-listview


    【解决方案1】:

    不要使用 setOnClickListener。 请务必使用 CursorAdapter 并在您的数据库中指定一个 ID 列。 当您自动设置protected void onListItemClick(ListView l, View v, int position, long id) 时,id 是数据库中的 ID。这样你就可以通过一个意图传递它并使用 id 从数据库中取回数据。

    希望它足够清楚。不好意思我写的比较匆忙

    从您的代码中只需添加

    myList.setOnItemClickListener(
            new OnItemClickListener()
            {
                @Override
                public void onItemClick(AdapterView<?> arg0, View view,
                        int position, long id) {
    
                          //here the id value is what you need to take data from the db filtering by id  
                     }
                }
         );
    

    【讨论】:

    • 我想我有点明白你的意思..我正在使用光标..这是我的代码。请查看我对用于从数据库获取信息的代码的编辑。
    • 好的,找到该放在哪里了。我如何获取信息以传递给下一个活动? Intent intent = new Intent(getBaseContext(), ListInfo.class); intent.putExtra("ID", position);开始活动(意图);
    • 您应该将 id 而不是位置传递给下一个 Activity。完成后,您可以使用 id 对您的数据库进行查询并取回数据
    【解决方案2】:

    你应该像这样为你的 ListView 设置监听器

    private OnItemClickListener onListItemClickListener = new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
            // TODO YOUR CODE
        }
    };
    
    private OnItemLongClickListener onItemLongClickListener = new OnItemLongClickListener() {
    
        @Override
        public boolean onItemLongClick(AdapterView<?> adapter, View view, int position, long id) {
            YOUR_CODE
        }
    };
    

    那是两种类型,longClicj 和点击,你可以同时使用它也可以使用它,这取决于你的需要

    在您的 onCreate 方法中,您应该将侦听器设置为您的 listView

    listView.setOnItemClickListener(onListItemClickListener);
    listView.setOnItemLongClickListener(onItemLongClickListener);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2016-11-20
      相关资源
      最近更新 更多