2016-10-22 7 views
-1

データベースのすべてのアイテムを表示するリストビューがあります。今日の日付と一致する項目のみを表示するようにデータを変更するボタンを作成しようとしています。ボタンアクションに基づいてSQLクエリを変更します。

ボタンのプッシュに基づいてアプリで実行されているクエリを変更し、リストビューを更新する最良の方法は何ですか?

私はonclick()メソッドでフラグを設定していましたが、クエリ呼び出しを保持していたif-elseステートメントとペアになっていましたが、どちらが呼び出されたかは切り替えられていないようです。

フラグはboolean filterTodayです。 todayButtonのonClickListenerで設定します。注目すべき最初の事はonclickリスナー、if(filterToday == true){...}内外あなたの更新filterToday = true;が知らないということですので、

public Cursor getAllTasks() { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("SELECT * FROM " + TASK_TABLE_NAME, null); 
    return res; 
} 

public Cursor getTodaysTasks(String date){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("SELECT * FROM " + TASK_TABLE_NAME + " WHERE " + 
      TASK_COLUMN_DATE + " =?", new String[]{date}); 
    return res; 
} 
+0

現在の実装を共有できますか? – Searching

+0

私はコードを追加しました。フラグがボタンクリックで変更されない理由はわかりませんし、これを行う最善の方法ですらフラグですか? – Jexoteric

答えて

0

私が遭遇した2つの問題がありました。最初は文字列をSQL文字列[]に比較していました。これは、比較が機能している間、期待通りに動作しなかったことを意味します。一度この問題を修正すると、ListViewオブジェクトが更新されていました。これは新しいアダプタを作成し、それをListViewにアタッチすることで処理されました。この回答パー

Refresh Current Fragment (ListView Data) remaining in the same activity

他のオプションは、アダプタのnotifyDataSetChanged()を呼び出すようにしたが、これは、私は私のプログラムを設定していた方法でうまく動作しませんでした。

0

OK:

public class MainActivity extends AppCompatActivity { 


public final static String KEY_EXTRA_CONTACT_ID = "KEY_EXTRA_CONTACT_ID"; 
private ListView listView; 
DBHelper dbHelper; 
boolean filterToday; 
Cursor cursor; 
String [] columns; 
int [] widgets; 


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

    Button addButton = (Button) findViewById(R.id.addNew); 
    addButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(MainActivity.this, AddTaskActivity.class); 
      intent.putExtra(KEY_EXTRA_CONTACT_ID, 0); 
      startActivity(intent); 
     } 
    }); 

    Button todayButton = (Button) findViewById(R.id.today); 
    todayButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      filterToday = true; 
     } 
    }); 

    dbHelper = new DBHelper(this); 

    if(filterToday == true){ 
     Calendar cal = Calendar.getInstance(); 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
     String date = df.format(cal.getTime()); 
     Toast.makeText(this,date,Toast.LENGTH_LONG).show(); 
     cursor = dbHelper.getTodaysTasks(date); 
    } 

    else{ 
     cursor = dbHelper.getAllTasks(); 
    } 

    columns = new String[] { 
      DBHelper.TASK_COLUMN_NAME, 
      DBHelper.TASK_COLUMN_TYPE, 
      DBHelper.TASK_COLUMN_DATE 

    }; 
    widgets = new int[] { 
      R.id.taskName, 
      R.id.taskType, 
      R.id.taskDate 
    }; 


    SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.task_info, 
      cursor, columns, widgets, 0); 
    listView = (ListView)findViewById(R.id.listView1); 
    listView.setAdapter(cursorAdapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> listView, View view, 
           int position, long id) { 
      Cursor itemCursor = (Cursor) MainActivity.this.listView.getItemAtPosition(position); 
      int taskID = itemCursor.getInt(itemCursor.getColumnIndex(DBHelper.TASK_COLUMN_ID)); 
      Intent intent = new Intent(getApplicationContext(), AddTaskActivity.class); 
      intent.putExtra(KEY_EXTRA_CONTACT_ID, taskID); 
      startActivity(intent); 
     } 
    }); 

} 
} 

これらは私が切り替えるしようとしています2つのクエリですそれ。あなたは、私は小さな変更を示唆しているアクションを実行したい場合は、その部分にのみ

は、データのロード

private void LoadMyData() { 

if(filterToday == true){ 
    Calendar cal = Calendar.getInstance(); 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 

    String date = df.format(cal.getTime()); 
    //you might need to update this line 
    //Toast.makeText(this,date,Toast.LENGTH_LONG).show(); 

    //assume dbHelper is ready at this point 
    cursor = dbHelper.getTodaysTasks(date); 
} 

else{ 
    cursor = dbHelper.getAllTasks(); 
} 

} 
のために外に別々の機能を作成するには、以下のように... oncreate()

に一度実行されますonclickのリスナー

filterToday = false;//initialize to false if necessary 
todayButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     filterToday = !filterToday ;//by doing it like this you can switch back and forth. add/check extra logic if necessary 
     LoadMyData(); 
    } 
}); 
LoadMyData(); //Call this outside in the oncreate to load the data initially 

の内側に私はここで、コードの改善を

この関数を呼び出しを示唆していませんよ。あなたがすでに持っているものに変わります。それが役に立てば幸い。

+0

プログラムの先頭に私はフラグのブール値を作成しました。私の理解によれば、それは両方に見えるでしょうか?私はonCreate()スコープ内でブール値を定義しなかったので、次のスコープのオブジェクトを使用して理解する必要があります。 – Jexoteric

+0

そこに問題はありません。ボタンをクリックすると、フラグを更新するだけでリストに何もしません。それが提案された変更です。フラグを更新し、変更されたフラグで再度クエリを呼び出します。 – Searching

関連する問題