Java 基于按钮操作更改SQL查询
我有一个显示数据库中所有项目的列表视图。我正在尝试创建一个按钮,该按钮将更改显示的数据,以仅显示与今天日期匹配的项目 基于按钮按下并更新listview,更改应用程序中正在运行的查询的最佳方式是什么 我在onclick()方法中设置了一个标志,并与保存查询调用的if-else语句配对,但它似乎没有切换调用的对象 该标志是今天的布尔过滤器。在onClickListener的Today按钮中设置Java 基于按钮操作更改SQL查询,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,我有一个显示数据库中所有项目的列表视图。我正在尝试创建一个按钮,该按钮将更改显示的数据,以仅显示与今天日期匹配的项目 基于按钮按下并更新listview,更改应用程序中正在运行的查询的最佳方式是什么 我在onclick()方法中设置了一个标志,并与保存查询调用的if-else语句配对,但它似乎没有切换调用的对象 该标志是今天的布尔过滤器。在onClickListener的Today按钮中设置 public class MainActivity extends AppCompatActivity
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);
}
});
}
}
好的,首先要注意的是更新
filterToday=true
在onclick
侦听器中,外部的if(filterToday==true){…}
不知道这一点。该部分仅在oncreate()中执行一次
如果你想做那件事,我建议你做个小改动。。如下
为数据加载在外部创建一个单独的函数
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();
}
}
在onclick
listner中调用此函数
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
我不是在建议代码改进。只是改变你已经拥有的。希望能有所帮助。我遇到了两个问题,第一个是将字符串与SQL字符串[]进行比较,这意味着在进行比较时,它的行为与我预期的不同。解决此问题后,将更新ListView对象。这是通过创建一个新的适配器并将其附加到ListView来处理的,然后ListView会自我更新
根据这一回答:
另一个选项是在适配器上调用notifyDataSetChanged(),但这与我设置程序的方式不太一致。您可以共享当前的实现吗?我添加了代码。我不知道为什么在点击按钮的时候,这个标志永远不会被改变,而且这个标志是最好的方法吗?在程序的顶部,我为这个标志创建了一个布尔值,所以据我所知,它对双方都是可见的,对吗?我没有在onCreate()范围内定义布尔值,因此它应该使用下一个范围内的对象,直到我理解为止。没有问题。当你点击按钮时,它只会更新标志,而不会对列表做任何事情。这就是建议的更改,更新标志,并使用更改的标志再次调用查询。
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