如何在单击列表视图项之前获取输入到数据库的详细信息,以显示详细视图

时间:2015-02-21 11:57:02

标签: android

我有一个列表视图,显示创建的任务列表。现在,当我单击Task1时,它应该显示Task1的详细视图,方法是获取创建task1时输入的详细信息。我试图通过覆盖OnItemClick方法时获得的“id”和“position”来做到这一点。这两个是否足够,请让我知道如何实现这一目标,欢迎所有建议。请帮助我。

我的OnItem Click方法截至目前:

 listView.setOnItemClickListener( new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Toast.makeText(getApplicationContext(), "The position of the item clicked is " +position, Toast.LENGTH_LONG).show();

                Cursor cursor = (Cursor) parent.getItemAtPosition(position);
              int taskID = cursor.getInt(cursor.getColumnIndex("task_name._id")); //Get the merchantID
                Toast.makeText(getApplicationContext(), "The name of task clicked is " +taskID, Toast.LENGTH_LONG).show();



            }

        });

我使用以下方法从数据库填充列表视图:

public void populateListView() {

        SQLiteDataBaseAdapter adapter = new SQLiteDataBaseAdapter(this);

        Cursor cursor = adapter.getAllData();

        String[] fromFieldNames = new String[]{SQLiteHelper.UID, SQLiteHelper.CONTACTS};
        int[] toViewIds = new int[]{R.id.textViewNumber, R.id.textViewName};

        SimpleCursorAdapter myCursorAdapter;
        myCursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.custom_list_row, cursor, fromFieldNames, toViewIds, 0);
        listView = (ListView) findViewById(android.R.id.list);
        listView.setAdapter(myCursorAdapter);



    }

我的列表视图如下所示:

任务1 TASK2 TASK3 Task4 ....

当我点击Task1时,我希望显示任务1的详细信息。请帮我。提前致谢。请帮我学习。

2 个答案:

答案 0 :(得分:0)

好的,因为我正在做类似的事情,我会在这个问题上采取行动。了解数据库的外观以及发送数据的位置会很有帮助。但是这里有一些数据库获取程序的块。我生成一个项目列表,然后点击它从数据库中提取项目信息。

OnCreateView(...)
  myDatabase = new DatabaseConnector(rootView.getContext());
  myDatabase.open();
  String search_key ="item";   // The name of the record im getting

我把这个函数放在下面,但它需要一个字符串和一个枚举来确定要查找的表,如果你只有一个你不需要的那个。

  Cursor query = myDatabase.getOneItem(search_key,Table.Spell);  

现在,您可以将它(查询)用作游标,或者像我一样,将其转换为ContentValues类型。我确定有一个很好的理由我这样做......但在这一点上我不记得它是什么。

  if (query != null)
  {
       database_values = myDatabase.theCursorHandler.toContentValues(query);
  }
  else  
  { 
       database_values = null;  
  }
  myDatabase.close();

我认为我这样做的原因是我会有一个ContentValues类型,其中包含用数据库中的列名标记的所有数据。 示例:名称生日性别列名称将为我提供一个看起来像名称的ContentValues:比尔生日:3月5日性别:男性,即使我更改数据库的结构也不需要更改。

现在你只需从database_values中获得你想要的东西

if ((database_values != null) && (database_values.containsKey("description"))
{
     String description_string = getdatabase_values.getAsString("description");

     // Do whatever it is you want with the string you have from the database.
}

上面的所有内容都应该能够作为一个单元进行复制粘贴并运行,因为我有格式化,片段以及savedInstanceState中的东西,我的有点混乱,所以我希望我没有删除任何重要的事情。上面的内容真正的主力是我的DatabaseConnector类,它位于底部(同样我修剪了所有多余的东西,希望没有太多修剪)。

DatabaseConnector()

public class DatabaseConnector extends SQLiteAssetHelper 
{
    private static final String DatabaseName = "simpledatabase";  // Database Name
    private static final int DATABASE_VERSION = 2;  // Im not srue why the database version is 2, ive not set it as far as I can tell!
    private SQLiteDatabase database;    // The database


    public DatabaseConnector(Context context)
    {       
   // Works
       super(context, (DatabaseName), null, DATABASE_VERSION);
    }

    // Opens the database.  Will need to see if it creates one if not found
    public void open() throws SQLException
    {
         database = getReadableDatabase();
    }

   public Cursor getOneItem(String name, Table table)
   {
        // Works!  Insensitive comparison of data items.
        return database.query(table.name(),null,"Upper(name)= Upper(\"" + name + "\")",null,null,null,null);
   }

   ContentValues toContentValues (Cursor data)
   {
       ContentValues value = null;
   // Check that data is something.
   if (data != null)
       {
           value = new ContentValues();
           if (data.isAfterLast())
           {
               // data was after the last entry, throw a null until I figure out how to throw an exception.
               return null;
           }
           // Be sure Cursor is pointing to at least the first row.
           // if it is pointing to some other row then we move it to the first.
           if (data.isBeforeFirst())
           {
                data.moveToFirst();
           }

           String[] column_names = data.getColumnNames();
           String temp_value ="";
           for (int i = 0; i < column_names.length;i++)
           {
               // Get the value out of column[i]
               temp_value = data.getString(data.getColumnIndex(column_names[i]));
               // Set the value into the Content at name with value
               value.put(column_names[i], temp_value);
        }
    return value;               
       }
       else
       {  // Data was null, so output null.
          return null;
       }
}

希望这会有所帮助,并希望它有意义。

答案 1 :(得分:0)

查看我们是否需要数据库取决于您的应用数据的复杂程度。

如果这是它将托管的唯一数据,您必须决定是否需要在设备中保留数据,即使没有互联网可用。

如果数据变得复杂(更多表等)或数据必须持续存在,则必须创建本地数据库。

为简单起见,我们假设这是唯一的数据。

您可以采取哪些措施来制作主详情应用流程,使您的应用结构如下:

enter image description here

您需要创建一个映射数据属性的自定义Java对象类。创建一个新的Java文件名称Task,看下面的代码:

public class Task {

private String name;
private String description;
private String remarks;
private String date_time;
private String actual_completion_time;
private String estimated_time;
private String notify_time;

public Task() {
}

public String getName() {
    return name;
}

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

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getRemarks() {
    return remarks;
}

public void setRemarks(String remarks) {
    this.remarks = remarks;
}

public String getDate_time() {
    return date_time;
}

public void setDate_time(String date_time) {
    this.date_time = date_time;
}

public String getActual_completion_time() {
    return actual_completion_time;
}

public void setActual_completion_time(String actual_completion_time) {
    this.actual_completion_time = actual_completion_time;
}

public String getEstimated_time() {
    return estimated_time;
}

public void setEstimated_time(String estimated_time) {
    this.estimated_time = estimated_time;
}

public String getNotify_time() {
    return notify_time;
}

public void setNotify_time(String notify_time) {
    this.notify_time = notify_time;
}
}

现在,在您的主要活动中,声明一个公共静态的任务对象数组,如下所示:

public static ArrayList<Task> mTaskList = new ArrayList<>();

在Main Activity的on create方法中,用数据填充数组。

然后在cerateView上的列表片段中获取对Main Activity mTaskList的引用并将其传递给适配器。

单击listView时,您可以获取项目位置并将其附加到intent并从详细信息片段中检索它。详细信息片段还将获取主活动中的mTaskList实例。

这是一个无需创建数据库的解决方案。

请告诉我如何进一步帮助你。