为动态 ListView 设置点击侦听器
Setting On Click Listener For A Dynamic ListView
感谢您随时待命...
我已经能够使用我在数据库中的信息填充我的 ListView。
现在,我想让项目的 setOnClickListener 转到不同的页面。目前,我正在使用 "switch(position)" 结构,但它不能正常运行,因为我无法硬编码 ListView 上有多少项目。
请帮我解决这个问题。
public class SurveyActivity 扩展 AppCompatActivity {
ArrayList<String> list = new ArrayList<String>();
SQLiteDatabase db;
DatabaseHelper helper = new DatabaseHelper(this);
String listItem = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_survey);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Add new survey", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
PopupMenu pop = new PopupMenu(SurveyActivity.this, fab);
pop.getMenuInflater().inflate(R.menu.addsurvey_menu, pop.getMenu());
pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(getApplicationContext(), "Your choice is to " + item.getTitle().toString().toUpperCase() + " a survey form", Toast.LENGTH_LONG).show();
switch (item.getItemId()) {
case R.id.c:
//Takes admin to page where survey is created
Intent i = new Intent(getApplicationContext(), CreateSurvey.class);
startActivity(i);
case R.id.d:
//gets ready created XML forms from server
case R.id.r:
//refreshes and updates survey list from db
}
return true;
}
});
pop.show();
}
});
db = helper.getReadableDatabase();
//Cursor crs = db.rawQuery("SELECT * FROM tbNames", null);
Cursor crs=db.query("tbNames",new String[]{ "names"},null,null,null,null,null);
if(crs.moveToFirst()){
do {
listItem =crs.getString(0);
list.add(listItem);
}while(crs.moveToNext());
}
ListView surveyList = (ListView) findViewById(R.id.surveylist);
ArrayAdapter<String> aAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
surveyList.setAdapter(aAdapter);
registerForContextMenu(surveyList);
surveyList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
Intent i = new Intent(getApplicationContext(), hivActivity.class);
startActivity(i);
break;
case 1:
Intent intent = new Intent(SurveyActivity.this, CreatedSurveyActivity.class);
startActivity(intent);
}
}
});
}
}
我的应用程序将允许用户创建多个调查,这些调查将显示在 LIstView 中。
问题是如何也为项目动态设置侦听器。
也许使用 setOnItemClickListener()
发布您的代码会有所帮助,但是在类似情况下通常可以提供帮助的方法是:
- 在生成每个视图时为其设置一个标签。例如,项目 ID,或者只是一个增量。
- onClickListener 将接收视图作为参数。然后可以从中检索标签。
- 然后可以将此标记与页面名称、页面 URL 或您尝试加载的任何其他信息相匹配。
你可以试试这个代码
surveyList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position == 0) {
Intent i = new Intent(getApplicationContext(), hivActivity.class);
startActivity(i);
} else {
Intent intent = new Intent(SurveyActivity.this, CreatedSurveyActivity.class);
startActivity(intent);
}
}
});
第一个项目将调用 hivActivity
,所有其他项目将调用 CreatedSurveyActivity
。如果你需要传递一些东西给 CreatedSurveyActivity
把它放到意图中,像这样 intent.putExtra("position" position);
感谢您随时待命...
我已经能够使用我在数据库中的信息填充我的 ListView。
现在,我想让项目的 setOnClickListener 转到不同的页面。目前,我正在使用 "switch(position)" 结构,但它不能正常运行,因为我无法硬编码 ListView 上有多少项目。
请帮我解决这个问题。
public class SurveyActivity 扩展 AppCompatActivity {
ArrayList<String> list = new ArrayList<String>();
SQLiteDatabase db;
DatabaseHelper helper = new DatabaseHelper(this);
String listItem = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_survey);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Add new survey", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
PopupMenu pop = new PopupMenu(SurveyActivity.this, fab);
pop.getMenuInflater().inflate(R.menu.addsurvey_menu, pop.getMenu());
pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(getApplicationContext(), "Your choice is to " + item.getTitle().toString().toUpperCase() + " a survey form", Toast.LENGTH_LONG).show();
switch (item.getItemId()) {
case R.id.c:
//Takes admin to page where survey is created
Intent i = new Intent(getApplicationContext(), CreateSurvey.class);
startActivity(i);
case R.id.d:
//gets ready created XML forms from server
case R.id.r:
//refreshes and updates survey list from db
}
return true;
}
});
pop.show();
}
});
db = helper.getReadableDatabase();
//Cursor crs = db.rawQuery("SELECT * FROM tbNames", null);
Cursor crs=db.query("tbNames",new String[]{ "names"},null,null,null,null,null);
if(crs.moveToFirst()){
do {
listItem =crs.getString(0);
list.add(listItem);
}while(crs.moveToNext());
}
ListView surveyList = (ListView) findViewById(R.id.surveylist);
ArrayAdapter<String> aAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
surveyList.setAdapter(aAdapter);
registerForContextMenu(surveyList);
surveyList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
Intent i = new Intent(getApplicationContext(), hivActivity.class);
startActivity(i);
break;
case 1:
Intent intent = new Intent(SurveyActivity.this, CreatedSurveyActivity.class);
startActivity(intent);
}
}
});
}
}
我的应用程序将允许用户创建多个调查,这些调查将显示在 LIstView 中。
问题是如何也为项目动态设置侦听器。
也许使用 setOnItemClickListener()
发布您的代码会有所帮助,但是在类似情况下通常可以提供帮助的方法是:
- 在生成每个视图时为其设置一个标签。例如,项目 ID,或者只是一个增量。
- onClickListener 将接收视图作为参数。然后可以从中检索标签。
- 然后可以将此标记与页面名称、页面 URL 或您尝试加载的任何其他信息相匹配。
你可以试试这个代码
surveyList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position == 0) {
Intent i = new Intent(getApplicationContext(), hivActivity.class);
startActivity(i);
} else {
Intent intent = new Intent(SurveyActivity.this, CreatedSurveyActivity.class);
startActivity(intent);
}
}
});
第一个项目将调用 hivActivity
,所有其他项目将调用 CreatedSurveyActivity
。如果你需要传递一些东西给 CreatedSurveyActivity
把它放到意图中,像这样 intent.putExtra("position" position);