列表视图返回相同的项目位置和ID

时间:2013-09-26 23:41:16

标签: java android

我试图让这个listview在长按时返回每行的sqlite db _id。

然而这一行

onItemLongClick(AdapterView<?> parent, View view, int position, long id)

返回列表中的“position”而不是id。

我已经没有想法......有人可以指出Android初学者正朝着正确的方向发展吗?

public class MySavedPlaces extends Activity {

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

    //Creating a List View
    ArrayList<String> listItems = new ArrayList<String>();
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(MySavedPlaces.this, android.R.layout.simple_list_item_1, listItems);
    final ListView mylist=(ListView) findViewById(android.R.id.list);
    mylist.setAdapter(adapter);

    String URL = "content://com.db.place/locations";
    Uri locations = Uri.parse(URL);
    Cursor c = getContentResolver().query(locations, null, null, null, "name");
    c.moveToFirst();

    if(c!=null){
    //If there are contents in the database
    do{
        String id=c.getString(c.getColumnIndex("_id"));
        String name=c.getString(c.getColumnIndex("name"));
        listItems.add(name);
        }while(c.moveToNext());
    }

    mylist.setOnItemLongClickListener(new OnItemLongClickListener() {
          @Override
          public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MySavedPlaces.this, android.R.layout.simple_list_item_1);
            adapter.add("Navigate...");
            adapter.add("Delete");
            AlertDialog.Builder builder = new AlertDialog.Builder(MySavedPlaces.this);
            builder.setTitle("whatever title "+id+ " "+position+" "+view.getId());
            builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) {
                    Log.d( "AlertDialog", "Positive"+item );
                    // item is the list item number - Navigate == 0, Delete == 1
                }
            });

            AlertDialog alert = builder.create();
            alert.show();

            // Return true to consume the click event
            return true;
          }

        });
}

2 个答案:

答案 0 :(得分:2)

我发现你没有存储这个值:

 String id=c.getString(c.getColumnIndex("_id"));

尝试创建具有id,name作为属性的对象列表,并将这些项存储在ArrayList中,以便您可以轻松地从ArrayList中获取这些项。

而不是:

    ArrayAdapter<String> adapter = 
new ArrayAdapter<String>(MySavedPlaces.this, android.R.layout.simple_list_item_1, listItems);

使用类似的东西:

    ArrayAdapter<DataBaseRowObject> adapter = 
new ArrayAdapter<DataBaseRowObject>(MySavedPlaces.this, android.R.layout.simple_list_item_1, listItems);

并在ItemLongClickListener上获取数据:

DataBaseRowObject selected = listItems.get(position);

答案 1 :(得分:0)

我认为问题在于列表适配器必须实现4个方法getcount列表中的视图数量。获取项目,特定索引列表视图中的子项。 Getview膨胀的孩子。最后但并非最不重要的是得到你需要改变的索引,因为大多数时候你不会使用数据库而人们只是把列表视图索引

相关问题