单击ListView项而不打开新的"活动"



我有一个ListView"resultList",但点击一个项目并不会打开新的(详细的)"活动"。我犯了什么错?非常感谢。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.resultList = (ListView) findViewById(R.id.resultList) ;
this.dataSource = MyExpenseOpenHandler.getInstance(this).readAllExpenses();
this.adapter = new ExpenseOverviewAdapter(this, dataSource);
this.resultList.setAdapter(adapter);
this.resultList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> adapterView, View view, final int i, final long l) {
Object element = adapterView.getAdapter().getItem(i);
if (element instanceof Expense) {
Expense expense = (Expense) element; 
Intent intent = new Intent(MainActivity.this, ExpenseDetailActivity.class);
intent.putExtra(ExpenseDetailActivity.EXPENSE_KEY, expense); 
startActivity(intent);
}
Log.e("Click on List: ", element.toString());
}
});
}

您的代码看起来不错。我认为问题在于if条件可能返回false,并且if语句中的代码没有被执行。您可以在if语句中放入一条日志消息,以检查代码是否正在执行。

if (element instanceof Expense) {
Log.d(YOUR_LOG_TAG,"The if condition not executed")
Expense expense = (Expense) element; 
Intent intent = new Intent(MainActivity.this, ExpenseDetailActivity.class);
intent.putExtra(ExpenseDetailActivity.EXPENSE_KEY, expense); 
startActivity(intent);
}

如果你在android监视器中看到日志消息,你可以确定If条件中的代码没有执行,因此你的活动没有启动。

您是否在类Expense上实现了Parcelable

像这样的

public class Expense implements Parcelable{
private String id;
private String name;
private String grade;
// Constructor
public Expense(String id, String name, String grade){
this.id = id;
this.name = name;
this.grade = grade;
}
// Getter and setter methods
.........
.........
// Parcelling part
public Expense(Parcel in){
String[] data = new String[3];
in.readStringArray(data);
// the order needs to be the same as in writeToParcel() method
this.id = data[0];
this.name = data[1];
this.grade = data[2];
}
@Оverride
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] {this.id,
this.name,
this.grade});
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public Expense createFromParcel(Parcel in) {
return new Expense(in); 
}
public Expense[] newArray(int size) {
return new Expense[size];
}
};

}

列表中的哪种视图,如果子视图获得类似焦点的按钮,可能会导致项目点击不正常。您可以尝试在列表视图中添加android:descendantFocusability="beforeDescendants"