2013-02-08 88 views
2

我从数据库(id,name)获取数据,并且想要在ListView中显示(名称)。当用户点击时,我需要获取数据库(id)来执行操作。我得到它的工作,但我的解决方案似乎很复杂这样一个简单的事情。我想以某种方式以隐藏的方式将(id)存储在ListView中,并且在用户选择项目时可以检索它。 这里是我的解决方案:从ListView获取数据库ID

class Route { //structure to store the data in ListView 
    public int id; 
    public String name; 
    public Route (int Id, String Name) { 
     id = Id; 
     name = Name; 
    } 
} 

// Create a custom adapter, we also created a corresponding 
// layout (route_row) for each item of the ListView 
public class MySimpleArrayAdapter extends ArrayAdapter<Route> { 
     private final Context context; 
     private final String[] values; 

     public MySimpleArrayAdapter(Context context, ArrayList<Route> routes) { 
     super(context, R.layout.route_row, routes); 
     this.context = context; 
     //Get the list of string array to display in the ListView 
     String[] values = new String[routes.size()]; 
     //Loop around all the items to get the list of values to be displayed 
     for (int i=0; i<routes.size(); i++) values[i] = 
        routes.get(i).id + " - " + routes.get(i).name; 
     //We added route.id to route.name for debugging but route.id is not necessary 
     this.values = values; //String array used to display data in the ListView 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.route_row, parent, false); 
     TextView textView = (TextView) rowView.findViewById(R.id.routeName); 
     textView.setText(values[position]); 

     return rowView; 
     } 
    } 

//output is a JSON array composed of JSON object routes 
void DisplayListView(String output) { (id, name) 
    ListView listView = (ListView) findViewById(R.id.listView1); 

    ArrayList<Route> list = new ArrayList<Route>(); 

    //Convert the JSON to ArrayList<Route> 
    try { 
    JSONArray json = new JSONArray(output); //Get JSON array 
    JSONObject jsonObj; 
    int id; 
    String name; 
    for(int i=0;i<json.length();i++) { 
     jsonObj = json.getJSONObject(i); //Get each JSON object 
     id = jsonObj.getInt("Id"); 
     name = jsonObj.getString("Name"); 
     list.add(new Route(id, name)); 
    } 
    } 
    catch (Exception ex) { 
     Log.w("Commute", ex.toString()); 
     ex.printStackTrace(); 
    } 

    //Create ArrayAdapter 
    MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(getApplicationContext(), 
                    list); 
    // Assign adapter to ListView 
    listView.setAdapter(adapter); 

    //Set a listener 
    listView.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
      Toast.makeText(getApplicationContext(), 
       "Click ListItem Number " + 
          ((Route)parent.getItemAtPosition(position)).id, 
          Toast.LENGTH_LONG) 
       .show(); 
      //It works when user clicks we display route.id 
      } 
     }); 
    } 

是不是有一个更简单的方法来做到这一点?我发现了类似的问题,但没有简单或明确的答案。
我可以避免使用自定义适配器吗?我只想为每行显示一个简单的ListView和一个文本。
我可以避免绕过ArrayAdapter来为adpater创建String数组吗?这似乎确实是一种不太有效的方式。

+0

我不能完全肯定,如果这是一个最好的做法,但实际上你可以存储在'隐藏'的TextView id' '或标签,然后为该对象设置'android:visibility =“gone”'。 –

回答

0

我会在后面详细说明答案,但这里有一部分答案。

  • 创建ListActivity是一个更好的方式开始(需要注册为项目点击收听的护理)

  • 在自定义阵列适配器,覆盖:public long getItemId (int position)返回相应的ID时onListItemClick GET调用。

  • 当使用SimpleCursorAdapter时,似乎数据库ID将被onListItemClick自动识别。这也许是因为我们做SimpleCursorAdapter的绑定时提供的ID:
    new String[] { "Name", "IsOffer", "Distance", BaseColumns._ID }, //Columns from table BaseColumns._ID new int[] { R.id.name, R.id.isOffer, R.id.distance, R.id.id },

0

使用View的setTag()方法将您自己的对象附加到视图。然后你可以使用这样的东西:

 vh.favourite.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      ForumThread th = (((ViewHolder) view.getTag()).thread); 
      th.setWatched(!th.isWatched()); 
      th.saveLater(); 
      notifyDataSetChanged(); 
     } 
    }); 
相关问题