当前位置: 首页 > 知识库问答 >
问题:

在ListView中使用带有复选框的onClickListener

蔚和风
2023-03-14
  private static final String TAG = "MainActivity";
    private HabitHelper mHelper;
    private ListView mHabitView;
    private ArrayAdapter<String> mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mHelper = new HabitHelper(this);
        mHabitView = (ListView) findViewById(R.id.habitList);

        FloatingActionButton myFab = (FloatingActionButton) findViewById(R.id.addHabit);
        CheckedTextView chkBox = (CheckedTextView) findViewById(R.id.habitItem);

        myFab.setOnClickListener(this);


        chkBox.setOnClickListener(this);

        updateUI();
    }

    public void onClick (View v){

        final EditText habitText = new EditText(this);
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setTitle("Add a new habit")
                .setMessage("What habit would you like to start working on?")
                .setView(habitText)
                .setPositiveButton("Add", new DialogInterface.OnClickListener(){
            @Override
                    public void onClick(DialogInterface dialog, int which) {
                String habit = String.valueOf(habitText.getText());
                SQLiteDatabase db = mHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put(HabitContract.HabitEntry.COLUMN_NAME_TITLE, habit);
                db.insertWithOnConflict(HabitContract.HabitEntry.TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
                db.close();
                updateUI();

            }
        })
                .setNegativeButton("Cancel", null)
                .create();
                dialog.show();

    }


    public class CheckBoxClick implements AdapterView.OnItemClickListener{

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            CheckedTextView ctv = (CheckedTextView)arg1.findViewById(R.id.habitItem);
            if (ctv.isChecked()){
                Toast.makeText(MainActivity.this, "You have completed your habit for the day", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(MainActivity.this, "Make sure you complete your task before checking me!", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void updateUI(){
        ArrayList<String> habitList = new ArrayList<>();
        SQLiteDatabase db = mHelper.getReadableDatabase();
        Cursor cursor = db.query(HabitContract.HabitEntry.TABLE, new String[]{HabitContract.HabitEntry._ID, HabitContract.HabitEntry.COLUMN_NAME_TITLE}, null, null, null, null, null);
        while (cursor.moveToNext()){
            int idx = cursor.getColumnIndex(HabitContract.HabitEntry.COLUMN_NAME_TITLE);
            habitList.add(cursor.getString(idx));
        }
        if (mAdapter == null){
            mAdapter = new ArrayAdapter<>(this, R.layout.item_habit, R.id.habitItem, habitList);
            mHabitView.setAdapter(mAdapter);
        }
        else {
            mAdapter.clear();
            mAdapter.addAll(habitList);
            mAdapter.notifyDataSetChanged();
        }
        cursor.close();
        db.close();
    }

    private void deleteHabit(View view){
        View parent = (View) view.getParent();
        TextView habitTextView = (TextView) parent.findViewById(R.id.habitItem);
        String habit = String.valueOf(habitTextView.getText());
        SQLiteDatabase db = mHelper.getWritableDatabase();
        db.delete(HabitContract.HabitEntry.TABLE, HabitContract.HabitEntry.COLUMN_NAME_TITLE + " = ?", new String[] {habit});
        db.close();
        updateUI();
    }}
    <?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.example.jonathan.myapplication.MainActivity"
    tools:layout_editor_absoluteY="81dp"
    tools:layout_editor_absoluteX="0dp">


    <ListView
        android:id="@+id/habitList"
        android:layout_width="0dp"
        android:layout_height="0dp"
        tools:layout_constraintTop_creator="1"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintBottom_creator="1"
        android:layout_marginStart="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginEnd="8dp"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_marginTop="8dp"
        tools:layout_constraintLeft_creator="1"
        android:layout_marginBottom="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/addHabit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="true"
        app:fabSize="mini"
        app:srcCompat="@android:drawable/ic_input_add"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="16dp"
        app:layout_constraintRight_toRightOf="parent"
        tools:ignore="RtlHardcoded" />
</android.support.constraint.ConstraintLayout>
 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">


    <CheckedTextView
        android:id="@+id/habitItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
        android:padding="5dp"
        android:checked="false"
        android:clickable="true"
        android:focusable="true"
        android:text=""
        />

</RelativeLayout>

共有1个答案

索梓
2023-03-14

您没有为ListView创建视图,并且CheckedTestView不在布局中。

您尝试为其设置侦听器的地方实际上应该在ListAdapter内部,您的CheckedTestViews将在该ListAdapter上创建。

我明白了,您使用了CursorAdapter,您可以检查单击然后进入listView槽:

 listView.setOnItemClickListener(new OnItemClickListener(){/**/});
 类似资料:
  • 问题内容: 我需要将复选框添加到JTree。自定义TreeCellRenderer / TreeCellEditor似乎是正确的方法。到目前为止,我在此网页中使用了CheckBoxNodeRenderer方法。除了两件事,它可以正常工作: 复选框上方+下方有额外的空格;我想使其与常规JTree相同。 我想区分单击复选框本身(应尝试切换复选框)和单击与复选框相关联的文本(应允许事件侦听器将此解释为单

  • 问题内容: 是否可以将复选框代替“链接名称”? 如果是这样怎么办? 谢谢, 问题答案: 是的,当然有可能。您可以使用标准复选框: 然后在单独的javascript文件中使用jQuery订阅此复选框的change事件,并毫不客气地对其进行AJAXify:

  • 我有一个简单的搜索列表视图与复选框,但它不能记住我的选择,当它得到过滤。 主要活动。xml 主要活动。JAVA 正如你在下面的图片中看到的,它不记得搜索后错误选择的“Petr”和“Ivan”。。。

  • 我将cell factory用于listview,并带有如下复选框: 它很好,但不是所有情况下。案例:当我说超过10个条目时,滚动窗格就出现了。假设我有位于8或9索引的beanChoices要检查(您必须滚动才能查看它们)。 对于不可见的项(位于scrollpane下)不调用监听器。 在调试时,我发现向下滚动时调用监听器。 问题:当我在上面的情况下从beanChoices中得到选中的值时,它返回空

  • 问题内容: 我的ListView自定义适配器(及其新实现的viewHolder)存在一些问题。我有一个ListView,每个项目都有一个复选框(这里没有新内容)。问题是,如果列表中有9个以上的项目,则当我选中第一个复选框时,将自动检查第10个复选框(第二个和第11个复选框相同),就像两个项目都有一个监听器一样(我相信情况确实如此)。 我在这里阅读了有关listView的位置问题,视图回收以及Vie

  • 我在这里使用这个示例代码创建一个JTree,其中所有的叶子都有一个复选框。我遇到的问题是,我还需要能够选择节点对象,而不必勾选复选框。在我的用例中,勾选复选框将使某些内容可见或隐藏,但选择节点将允许在UI的单独部分编辑对象。最好的方法是什么?是否可以检测何时单击复选框的“框”部分,或者是否选中节点? 我看到的另一个错误是,当文件夹有子元素时,文件夹左侧的指示器正确显示文件夹已打开: 但是如果'文件