单击 ListView 项目未打开新活动
Posted
技术标签:
【中文标题】单击 ListView 项目未打开新活动【英文标题】:Click on ListView item not opening new Activity 【发布时间】:2018-04-13 21:30:57 【问题描述】:我有一个 ListView“resultList”,但点击一个项目并没有打开新的(详细的)Activity。我的错误是什么? 谢谢!
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());
);
【问题讨论】:
你能把你的Log.e("Click on List: ", element.toString());
放在if(element instanceof Expense)
块中看看它是否正在执行吗?
简单地说if(element instanceof Expense)
就是false
@Jochen Scheele DataSource 的类型是什么?我认为您的问题是您的 startActivity 代码根本没有执行,因为 element 不是 Expense 的实例。
感谢所有的cmets。我会寻求您的建议,然后再提出问题(如果需要)。非常感谢您的快速回复!
【参考方案1】:
您的代码似乎没问题。我认为问题在于您的 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 条件中的代码没有执行,因此您的活动没有开始。
【讨论】:
我在 if 子句(费用费用 = (Expense) 元素;)前面编写了转换。然后它正在工作并打开新窗口。但是,我仍然不明白为什么 (Object element = adapterView.getAdapter().getItem(i);) 不是我想要的 Expense 实例...谢谢您的帮助!【参考方案2】:您是否在您的课程费用上实现了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];
;
【讨论】:
【参考方案3】:列表中什么样的视图,如果子视图获得焦点like按钮可能导致item点击不能正常工作。
您可以尝试在列表视图中添加android:descendantFocusability="beforeDescendants"
。
【讨论】:
或在子视图上添加 android:clickable="false" android:focuable="false"以上是关于单击 ListView 项目未打开新活动的主要内容,如果未能解决你的问题,请参考以下文章
Android - 在 RecyclerView 中单击的项目上打开新活动 [重复]
单击 Listview 中的项目时,如何在新活动中从 Firebase 检索数据?
将“标题”项目保存到 ListView 并单击项目以将数据加载到新活动