簡體   English   中英

將onClickListener與ListView中的CheckBoxes一起使用

[英]Using onClickListener with CheckBoxes in a ListView

因此,我一直在嘗試在切換復選框時進行注冊。 到目前為止,我還沒有運氣。 onClickListener是否適合這種情況? 當我嘗試使用它時,出現一個錯誤。

MainActivity.java

  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();
    }}

activity_main.xml中

    <?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>

item_habit.xml

 <?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>

錯誤

java.lang.RuntimeException:無法啟動活動ComponentInfo {com.example.jonathan.myapplication / com.example.jonathan.myapplication.MainActivity}:java.lang.NullPointerException:嘗試調用虛擬方法'void android.widget.CheckedTextView。在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)上的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)上的null對象引用上的setOnClickListener(android.view.View $ OnClickListener)' .ActivityThread.-wrap11(未知來源:0)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1593)在android.os.Handler.dispatchMessage(Handler.java:105)在android.os.Looper。 com.android.internal.os.Zygote $ MethodAndArgsCaller處的java.lang.reflect.Method.invoke(Native Method)處的android.app.ActivityThread.main(ActivityThread.java:6541)處的Loop(Looper.java:164)。在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)上運行(Zygote.java:240)原因:java.lang.NullPointer 例外:嘗試在com.example.jonathan.myapplication.MainActivity.onCreate(MainActivity.java:50)上的空對象引用上調用虛擬方法'void android.widget.CheckedTextView.setOnClickListener(android.view.View $ OnClickListener)'在android.app.Activity.performCreate(Activity.java:6975)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)在android.app。 android.app.ActivityThread.-wrap11(未知源:0)位於android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1593)位於Activity.Thread.handleLaunchActivity(ActivityThread.java:2892)在android.os.Handler.dispatchMessage (Handler.java:105)在android.os.Looper.loop(Looper.java:164)在android.app.ActivityThread.main(ActivityThread.java:6541)在java.lang.reflect.Method.invoke(本機方法)在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)在com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)

您沒有為Lis​​tView創建視圖,而CheckedTestView不在布局內。

您嘗試為其設置偵聽器的位置實際上應該在將創建CheckedTestViews的ListAdapter內。

我看到,您使用過CursorAdapter,可以檢查單擊次數,然后進入listView槽:

 listView.setOnItemClickListener(new OnItemClickListener(){/**/});

但是,您必須刪除chb.setOnClickListener(this),因為它們是列表中的項目,而不是布局中的單個視圖。

您的CheckedTextView是item_habit.xml的一部分,而不是activity_main.xml chBox顯然將為null,因此將引發Null指針異常。

我不確定您是否有適配器並且在此處未包括它,或者您沒有適配器。 如果稍后出現這種情況,我建議更正您的列表視圖和適配器初始化。 如果您有adpater,則適配器的GetCell()方法中應該包含ckeckedchangelistener。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM