1

リストビューにデータベースと Y 表示レコードを作成しました。リストビュー レコードを長押しすると、コンテキスト メニューが開きます。コンテキスト メニューには、最初に表示操作と 2 つ目の削除操作の 2 つの操作があります。表示を選択すると、次のアクティビティで完全な記録が表示されます。

ListActivity.java

public class ListActivity extends Activity {
    ListView lv;
    ArrayList<String> items = new ArrayList<String>();
    ArrayList<String> items_id = new ArrayList<String>();
    dbhelper dh;
    SQLiteDatabase db;
    int index_id;
    Button btn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        Button btn;
        btn = (Button)findViewById(R.id.newProjectlist);
        btn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub


                    Intent intent= new Intent(ListActivity.this,NewProject.class);
                startActivity(intent);
            }
        });  
        lv = (ListView)findViewById(R.id.projectListView);
        setUpList();
        dh = new dbhelper(this);
        Cursor c = getAllData();
        showAllData(c);  
        registerForContextMenu(lv);      
    }

  @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);

        if(v.getId() == R.id.projectList){
            menu.setHeaderIcon(R.drawable.ic_launcher);
            menu.setHeaderTitle("Record List");
            menu.add(0,1,menu.NONE,"Delete Record");
            menu.add(0,2,menu.NONE,"Show Record");
        }
    }

    @Override
public boolean onContextItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
        int itemId = item.getItemId();
        if(itemId == 1)
        {
            AdapterView.AdapterContextMenuInfo menuinfo;
            menuinfo = (AdapterContextMenuInfo) item.getMenuInfo();
            index_id = menuinfo.position;
            deleteUserData(index_id);
        }
        if(itemId == 2){
            AdapterView.AdapterContextMenuInfo menuinfo;
            menuinfo = (AdapterContextMenuInfo) item.getMenuInfo();
            index_id = menuinfo.position;
            editUserData(index_id);
        }
    return super.onContextItemSelected(item);
}

    private void editUserData(int indexid) {
        // TODO Auto-generated method stub
        String user_id = items_id.get(indexid);
        Intent intEdit = new Intent(ListActivity.this, MainActivity.class);
        intEdit.putExtra("EditID", user_id);
        startActivityForResult(intEdit, 1);
    }

    private void deleteUserData(int indexid) {
        // TODO Auto-generated method stub
        String user_id = items_id.get(indexid);
        //Toast.makeText(getApplicationContext(), "id " + user_id, 1).show();
        db = dh.getWritableDatabase();
        db.delete("timer","_ID" + "=" + user_id, null);
        finish();
//      Toast.makeText(getApplicationContext(), "Record deleted successfully", 1).show();
    }

    private void showAllData(Cursor c) {
        // TODO Auto-generated method stub
        while(c.moveToNext())
        {
            int id = c.getInt(0);
            String name = c.getString(1);
            String timerpoint1 = c.getString(2);
            String timerpoint2 = c.getString(3);
            String timerpoint3 = c.getString(4);
            String servicetime1 = c.getString(5);
            String servicetime2 = c.getString(6);
            items.add("" + name);
            items_id.add(""+id);
        }
        setUpList();
    }

    private Cursor getAllData() {
        // TODO Auto-generated method stub
        db = dh.getReadableDatabase();
        //String sortorder = dh.Name + "DESC";
    //  String query ="SELECT DISTINCT name FROM timer";
    //  Cursor c = db.rawQuery(query, null);
    //   if (c != null) {
    //            c.moveToFirst();
    //        }
        String[] cols = new String[] {dh.Name, "name"};
        Cursor c = db.query(true, "timer",null,null,null,null,"ASC",null, null);   
        //Cursor cur = db.query(Distinct,"timer", null, null, null, null, null, null, null);
        startManagingCursor(c);
        return c;   
        }
    private void setUpList() {
        // TODO Auto-generated method stub
        lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,items));
    }   

    }

削除を選択すると、レコードが削除されます。コンテキスト メニューを使用すると、この目標を達成できます。そのアプリケーションのコードがいくつかありますが、コードが正しく機能していません。だから、これを手伝ってください。

4

2 に答える 2

0

表示されている内容の詳細を入力してください。ただし、コードを見ると、リストビューはおそらく同じ状態のままであり、削除した後も更新されていないと思います。その場合は、おそらくカーソルを再クエリする必要があります。このメソッドは非推奨ですが、それを使用してそれが問題であるかどうかを検証するか、ドキュメントが示すようにカーソルの新しいインスタンスを取得してロードすることができます。

于 2013-01-02T03:34:59.507 に答える
0

いくつかのこと: まず、削除方法がオフになっています。_idid フィールドを取得し、削除する対応する文字列を見つけましたが、この文字列を使用してフィールドで削除しようとしています。これらの文字列はその列に含まれないため、この方法では何も削除されません。オリジナルで単純に削除する方が良いですlong id

private void deleteUserData(long indexid) {
    db.delete("timer","_ID" + "=" + indexid, null);
    finish();
}

それでおしまい。現在、他の問題は実際に削除するIDを取得することです。あなたが使っている

index_id = menuinfo.position;

しかし、それはデータベースにIDを与えません。ListViewこれは、アダプタ上の位置を示しているだけです。これを取得するには、この位置を使用する必要があります_id。を使用しているため、このリストビューに入力するために使用される対応するコレクションからArrayAdapterを取得することを意味します。_id

したがって、人口法に基づいています。

private void showAllData(Cursor c) {
    while(c.moveToNext())
    {
        int id = c.getInt(0);
        String name = c.getString(1);
        .....
        items.add("" + name);
        items_id.add(""+id);
    }
    lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,items));
}

_id現在の位置に基づいてこれを取得するために今何をする必要があるかは明らかです。

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        if(itemId == 1)
        {
            AdapterView.AdapterContextMenuInfo menuinfo = (AdapterContextMenuInfo) item.getMenuInfo();
            int position = menuinfo.position;
            String id_string = items_id.get(position);
            long id = Long.valueOf(id_string);
            deleteUserData(id);
//          then you probably want it off the corresponding collection too
            items_id.remove(position);
        }
        .....
于 2013-01-02T03:48:55.327 に答える