我已经看到有关在一个活动中显示多个列表视图的多个问题,但我的问题与两者的onClick行为有关。我设置了两个彼此列表视图,并动态填充它们 - 这很好。问题在于为两个列表设置onClick行为。使用我当前的代码,如果单击第一个列表中的相同项目,则第二个列表将在已打开的活动之上打开所需的活动。因此,当用户返回时,由于后栈错误,它会进入错误的活动。
我在这里定义onItemClick行为的代码如下:
//make listview items respond to clicks and open relevant activity
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// selected item
String standard = ((TextView) view).getText().toString();
// Launching new Activity on selecting single List Item
Intent i = new Intent(SubjectActivity.this, StandardInfoActivity.class);
// sending data to new activity
i.putExtra("standard", standard);
i.putExtra("subject", subjectId);
i.putExtra("subjectName", subject);
i.putExtra("level", level);
startActivity(i);
finish();
}
});
gradeView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent2, View view,
int position, long id2) {
// Launching new Activity on selecting single List Item
Intent j = new Intent(SubjectActivity.this, AddGradeActivity.class);
// sending data to new activity
j.putExtra("subjectId", subjectId);
j.putExtra("position", position);
j.putExtra("level", level);
j.putExtra("subject", subject);
startActivity(j);
finish();
}
});
我的猜测是,因为我为两者定义了相同的功能,所以只需点击第二个列表就可以调用两次,一次用于第一个列表,然后再用于所需列表。在这种情况下,定义两个列表行为的正确方法是什么?
编辑:用于设置适配器的代码:
ArrayList<String> mArrayList = myDb.getStandards(subjectId);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
this, R.layout.subject_list_item, mArrayList);
lv.setAdapter(arrayAdapter);
ArrayList<String> gradeList = myDb.getGrades(subjectId);
ArrayAdapter<String> arrayAdapter2 = new ArrayAdapter<String>(
this, R.layout.subject_list_item, gradeList);
gradeView.setAdapter(arrayAdapter2);
像这样调用finish()将导致为当前活动(https://developer.android.com/guide/components/activities/activity-lifecycle#ondestroy)调用onDestroy(),这将使其脱离后端堆栈。所以我认为你可能会回来并获得令人惊讶的结果。
如果你真的触发onItemClickListeners,你可以看到一种方法是你可以向两者添加临时调试消息,然后看看你得到了什么样的输出。比如,在一个你可以尝试Log.d("ClickListener", "lv was clicked");
,另一个尝试Log.d("ClickListener", "gradeView was clicked");
然后检查Logcat,看看会出现什么。
在适配器中创建一个接口。然后,您可以覆盖您的活动中的方法。接口:
public interface ItemClickAdapterListener {
void itemClick(View v, int position);
}
项目点击:
viewHolder.llayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onClickListener.itemClick(view,position);
}
});
活动代码。像这样创建Adapter对象
YourAdpter adapter= new YourAdpter(new YourAdapter.ItemClickAdapterListener() {
@Override
public void itemClick(View v, int position) {
}
}):