2016-06-13 8 views
2

SQLiteデータベースとListViewがメインアクティビティに表示されています。 ListViewには、各リスト番号の詳細が表示され、リスト項目を押すと、詳細が表示される新しいアクティビティが開きます(TextView)。SQLite行IDがListView行IDと一致しません

これらはそれぞれListViewの削除機能があり、正常に動作しません。基本的には、作成されたそれぞれにユニークなIDが与えられます。ListViewは、SQLiteデータベースの動作方法です。ただし、ListView内の行を削除すると、一意のIDは増加しますが、行IDはその番号を削除してすべてを上に移動します。つまり、アイテムを削除すると、ローIDとデータベースIDが一致しなくなり、ListView内のアイテムを選択しようとするとクラッシュします。これは私のデータベースアダプタクラスの抜粋です。

public Integer deleteStat(Integer id) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    return db.delete(STATS_TABLE, "id = ? ", new String[]{Integer.toString(id)}); 
} 

これは私の主な活動の最初の試みです。私はthisポストからいくつかの情報を得たが、正しい整数を取得するために失敗し、構文エラーを受信:

obj.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

TextView pos = (TextView) findViewById(R.id.editTitle); 
displayText(Integer.parseInt(pos.getText().toString())); 
     } 
    }); 
} 

public void displayText(int pos) 
{ 
    pos++; 
    String s = ""; 
    s += pos; 

    Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class); 
    intent.putExtra("id", s); 
    startActivity(intent); 

} 

これが主な活動で、私の第二の試みです。私はthisチュートリアルを使って私を助けました。そのウェブサイトから私が使用したコードは、削除機能全体を破壊しました。

obj.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
      int id_To_Search = arg2 + 1; 
      int id_To_Search = arg0.getCount() - arg2; 

      Bundle dataBundle = new Bundle(); 
      dataBundle.putInt("id", id_To_Search); 

      Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class); 

      intent.putExtras(dataBundle); 
      startActivity(intent); 

どのようにしてデータベースIDを行IDと一致させることができますか?どのようにそれを行うための任意の提案?

EDIT:ハッシュマップコードに追加されました。私はListView項目で押すと、何もあなたがデータベース内の行を削除するListView位置を渡すことはありません

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

    mydb = new StatisticsDbAdapter(this); 
    ArrayList array_list = mydb.getAllStats(); 
    ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array_list); 

    obj = (ListView) findViewById(R.id.listView1); 
    obj.setAdapter(arrayAdapter); 
    /* 
    New code starts here 
    */ 
    Bundle extras = getIntent().getExtras(); 
    if (extras != null) { 
     int Value = extras.getInt("id"); 

     if (Value > 0) { 
      //means this is the view part not the add contact part 
      Cursor cursor = mydb.getData(Value); 
      hashMap.put(cursor.getString(1), cursor.getInt(0)); 

obj.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int arg2, long arg3) { 
    TextView textView = (TextView) view.findViewById(R.id.editTitle); 
        Bundle dataBundle = new Bundle(); 
        dataBundle.putInt("id", hashMap.get(textView.getText().toString())); 

        Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class); 

        intent.putExtras(dataBundle); 
        startActivity(intent); 
} 
      }); 
     } 
    } 
} 
+1

'SQLiteの行IDがListViewと一致しません。これは明らかです。あなたのIDが953で始まるとしましょう(多くの試行を行い、すべてのテストレコードを何度も削除したためです)。 ListViewはアイテム番号953から始まるとふりまといますか?いいえ、明らかにそうではありません。それはITSアイテム番号0でそのアイテムにデータを入力し始めます。 –

+0

データベースIDがリストビューから行を削除した後、データベースIDを呼び出してコールバックすると、データベースIDがそのラインIDと一致するようにするにはどうすればいいですか? –

+0

Googleのキーワード: 'android listview database delete' –

答えて

0

を起こりません。私はこれまで何度もやってきました。まず、クリックイベントを管理するクラス内で、新しいHashMapを作成します。このHashMapは、データベースから行IDを格納するために使用され、ListViewアイテムの位置ではなく、その行IDを参照します。

public HashMap<String, Integer> hashMap = new HashMap<>(); 

作業が完了したら、あなたはListView内のすべての行を表示する機能で、あなたもこのようなHashMapに同じ項目をロードしなければならない、ということ:それを作成するには、このコードを入力

hashMap.put(cursor.getString(1), cursor.getInt(0)); 

cursor.getString(1)は、使用したものと異なる場合があります。 1を、その中に名前が格納されている適切な列番号に置き換えてください。 cursor.getInt(0)はデータベースから行IDを取得し、列番号もあなたのために異なる場合があります。今、私たちのOnClickListener関数内で、我々は、入力することができます。

obj.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view) { 
     TextView textView = (TextView) view.findViewById(R.id.editTitle); 
     Bundle bundle = new Bundle(); 
     bundle.putInt("id", hashMap.get(textView.getText().toString())); 

     Intent intent = new Intent(getApplicationContext(), DisplayStatsActivity.class); 

     intent.putExtras(bundle); 
     startActivity(intent); 
} 

hashMap変数は、あなたのListViewのクリックイベントを管理したり、あなたがミスを取得します、同じクラス内であることが必要であることに注意してください。最初に渡したパラメータの一部は、必要がないため削除されました。また、RecyclerViewを使用してこれがよりうまく動作することがわかりましたが、それはあなた次第です。問題がある場合は、下にコメントすることをためらわずに、できるだけ早く回答を試みます。

+0

こんにちは、この素晴らしい応答をありがとう! 私はいくつかのものを追加しようとしましたが、hashMapが動作しているようです。 しかし、現在追加しているアイテムの一部をクリックすると、現在何も起こっていません。 私はそれがライン 'のTextViewのPOS =(TextViewの)findViewById(R.id.editTitle)とは何かを持っていることと信じ;' あなたは私がここにタイトル行を呼び出すべきではないと思いますか?私は、その行がちょうどデータが来るはずのIDを取得すると考えているときに、TextViewでどの変数を参照するべきかわからない。 あなたの考えを知ってもらいましょう! –

+0

おそらくあなたが言及した行です。私がお勧めするのはあなたが[this](http://stackoverflow.com/questions/9208827/how-to-extract-the-text-from-the-selected-item-on-the-listview)のリンクにアクセスして選択した項目のTextView値を渡し、その代わりに渡します。 –

+0

私はもう一度あなたに提供したコードを確認してください。私は現在動作するはずのいくつかのものを微調整しました。 –

関連する問題