单击 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 并单击项目以将数据加载到新活动

从 Activity 返回时如何获取最后一个 ListView 状态

从列表视图中单击歌曲后,新活动正在打开但歌曲未播放

单击时从 ListView 继续进行新活动