【问题标题】:OnItemClickListener is not firingOnItemClickListener 没有触发
【发布时间】:2017-12-16 08:11:00
【问题描述】:

我正在制作一个应用程序,该应用程序在 ListView 中显示了要执行的练习列表。我试图让用户从列表中选择一个项目来开始一个新的活动,但我的 OnItemClickListener 没有触发。这是我的Activity,(不是listActivity,是appCompatActivity):

ArrayList<Exercise> myExercises = new ArrayList<>();
AlertDialog.Builder alertDialogBuilder;
ArrayAdapter<Exercise> arrayAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);
    refreshList();
    Button newExButton = (Button) findViewById(R.id.newExButton);

    arrayAdapter = new ArrayAdapter<Exercise>(
            this,
            android.R.layout.simple_list_item_1,
            myExercises );

    ListView lv = (ListView) findViewById(R.id.actList);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            System.out.println("listener heard");
            // selected item
            int selection = position;
            startExercise(selection);
        }
    });

    lv.setAdapter(arrayAdapter);
}

public void refreshList(){
    setContentView(R.layout.activity_list);
    ListView lv = (ListView) findViewById(R.id.actList);

    lv.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
    lv.setAdapter(arrayAdapter);
}

public void startExercise(int selection){

    Intent exIntent = new Intent(this, CommenceExercise.class);
    Exercise chosenEx = myExercises.get(selection);
    Bundle info = new Bundle();
    info.putLong("duration", chosenEx.getTime());
    info.putString("name", chosenEx.getName());
    info.putString("description", chosenEx.getDescription());
    exIntent.putExtras(info);
    startActivity(exIntent);
}

列表最初是空的,但用户通过按下按钮来添加项目。该按钮通过以下代码创建一个alertDialog:

public void addNewActivity(View view) {
    //get prompts.xml view
    LayoutInflater li = LayoutInflater.from(context);
    View promptsView = li.inflate(R.layout.custom, null);

    alertDialogBuilder = new AlertDialog.Builder(
            context);

    // set prompts.xml to alertdialog builder
    alertDialogBuilder.setView(promptsView);

    final EditText userInput = (EditText) promptsView
            .findViewById(R.id.exNameInput);
    final EditText durInput = (EditText) promptsView
            .findViewById(R.id.exDurInput);

    // set dialog message
    alertDialogBuilder
            .setCancelable(false)
            .setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,int id) {
                                    long duration = 0;
                                    String exName;
                                    exName = userInput.getText().toString();
                                    duration = Integer.valueOf(durInput.getText().toString());
                                    myExercises.add(new Exercise(exName, duration));
                                   // create new exercise with user input
                                    refreshList();
                                }
                            })
                    .setNegativeButton("Cancel",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,int id) {
                                    dialog.cancel();
                                }
                            });
            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();
            // show it
            alertDialog.show();
}

}

这是我的 xml:

<android.support.constraint.ConstraintLayout   
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
tools:context="com.example.mytimer.ListActivity">

<TextView
    android:id="@+id/textView2"
    android:layout_width="146dp"
    android:layout_height="30dp"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_marginTop="16dp"
    android:text="Activities"
    android:textAlignment="center"
    android:textSize="24sp"
    app:layout_constraintHorizontal_bias="0.502"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginStart="16dp"
    android:clickable="false"
    android:layout_marginEnd="16dp" />

<Button
    android:id="@+id/newExButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="16dp"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="87dp"
    android:onClick="addNewActivity"
    android:text="New Exercise"
    android:textSize="18sp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView2" />

<ListView
    android:id="@+id/actList"
    android:layout_width="328dp"
    android:layout_height="301dp"
    android:layout_marginBottom="16dp"
    android:layout_marginEnd="16dp"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:descendantFocusability="blocksDescendants"
    android:focusable="false"
    android:clickable="false"
    android:focusableInTouchMode="false"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/newExButton"
    app:layout_constraintVertical_bias="1.0">
<requestFocus/>
</ListView>

<TextView
    android:id="@+id/debugText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="36dp"
    android:text="TextView"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    android:clickable="false"
    app:layout_constraintTop_toBottomOf="@+id/textView2" />

</android.support.constraint.ConstraintLayout>

当我点击已添加到列表中的项目时,没有任何反应。我可以说 OnItemClickListener 没有被触发,因为 System.out 行从未被打印。我不知道为什么我不能让它工作。任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 只需更改refreshList 方法,它会工作..read this also
  • 也可以在设置点击监听之前尝试设置适配器

标签: java android listview onitemclick


【解决方案1】:

您需要从 xml 中删除以下列表视图属性:

    android:descendantFocusability="blocksDescendants"
    android:focusable="true"
    android:clickable="true" 
    android:focusableInTouchMode="true"

另外,不需要 refreshList() 这实际上是一种不好的做事方式,而是在你的 addNewActivity() 中,一旦你的模型准备好(可能是点击正面按钮)将该项目添加到 arrayAdapter 然后执行arrayAdapter.notifyDataSetChanged().

希望对你有帮助!

【讨论】:

  • 谢谢!实际上我最终从头开始重新开始整个活动并让它工作,但是这次我没有将上述任何行添加到 xml 文件中。
【解决方案2】:

我认为XML有问题请设置ListView可点击true

请在 XML 中做一些更改

<ListView
    android:id="@+id/actList"
    android:layout_width="328dp"
    android:layout_height="301dp"
    android:layout_marginBottom="16dp"
    android:layout_marginEnd="16dp"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:descendantFocusability="blocksDescendants"
    android:focusable="true" // change this
    android:clickable="true" // change this
    android:focusableInTouchMode="true" // change this
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/newExButton"
    app:layout_constraintVertical_bias="1.0">
<requestFocus/>
</ListView>

【讨论】:

    【解决方案3】:

    将您的 refreshList 方法更改为以下一个

    public void refreshList(){
        arrayAdapter.notifyDataSetChanged();
    }
    

    您正在做的是,再次膨胀 ListView 并为其设置新数据,而不是更新旧数据。当您为ListView 分配新值时,您忘记设置onClickListener

    它会起作用的。

    【讨论】:

      【解决方案4】:

      这真的很奇怪......你的代码应该可以工作......我建议你尝试在你的活动中实现包含lv.setClcickable(true)lv.setEnable(true)

       public class MenuActivity extends AppCompatActivity implements 
       AdapterView.OnItemClickListener{    
           ArrayList<Exercise> myExercises = new ArrayList<>();
           AlertDialog.Builder alertDialogBuilder;
           ArrayAdapter<Exercise> arrayAdapter;
      
           @Override
           protected void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                 setContentView(R.layout.activity_list);
                 refreshList();
                 Button newExButton = (Button) findViewById(R.id.newExButton);
      
                 arrayAdapter = new ArrayAdapter<Exercise>(
                           this,
                           android.R.layout.simple_list_item_1,
                           myExercises );
      
                 ListView lv = (ListView) findViewById(R.id.actList);
                 lv.setClickable(true);
                 lv.setEnabled(true);
                 lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
              public void onItemClick(AdapterView<?> parent, View view , int 
                 position, long id)
               {
                             startExercise(position);
               }
                 lv.setAdapter(arrayAdapter);
           }
      
           public void refreshList(){
                 setContentView(R.layout.activity_list);
                 ListView lv = (ListView) findViewById(R.id.actList);
      
                 lv.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
                 lv.setAdapter(arrayAdapter);
           }
      
           public void startExercise(int selection){
      
               Intent exIntent = new Intent(this, CommenceExercise.class);
               Exercise chosenEx = myExercises.get(selection);
               Bundle info = new Bundle();
               info.putLong("duration", chosenEx.getTime());
               info.putString("name", chosenEx.getName());
               info.putString("description", chosenEx.getDescription());
               exIntent.putExtras(info);
               startActivity(exIntent);
         }     
      
      
      }
      

      或将这三行添加到您的 xml 中

       android:focusable="false"
       android:focusableInTouchMode="false"
       android:clickable="true
       android:descendantFocusability="blocksDescendants"
      

      如果有任何可聚焦的子视图,那么第一次点击将始终是焦点 我建议您使用自定义ListViewViewholder 模式以提高效率或支持库的Recyclerview 这将使您的滚动平滑并且不会创建额外的视图对象......它只会创建视图对象这将适合屏幕

      这是RecyclerViewhttps://guides.codepath.com/android/using-the-recyclerview的链接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多