【问题标题】:Click on ListView item not opening new Activity单击 ListView 项目未打开新活动
【发布时间】: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。我会寻求您的建议,然后再提出问题(如果需要)。非常感谢您的快速回复!

标签: android listview android-activity


【解决方案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"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多