Android ListView onItemLongClick视图isSelected始终返回False

Android ListView onItemLongClick视图isSelected始终返回False,android,listview,simplecursoradapter,onlongclicklistener,Android,Listview,Simplecursoradapter,Onlongclicklistener,我有一个类扩展了ListFragment,并使用了SimpleCursorAdapter。我已经创建了两个按钮,使用户可以选择/取消选择列表中的所有内容,这很好。列表中可能有200个项目,因此如果他们只想选择其中的190个,可以选择全部200个,然后取消选择10个 ListView使用setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE) 问题是,我希望用户能够通过长按某行来单独取消选择该行。我在列表视图上使用了setOnItemLongClickLis

我有一个类扩展了
ListFragment
,并使用了
SimpleCursorAdapter
。我已经创建了两个按钮,使用户可以选择/取消选择列表中的所有内容,这很好。列表中可能有200个项目,因此如果他们只想选择其中的190个,可以选择全部200个,然后取消选择10个

ListView使用
setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE)

问题是,我希望用户能够通过长按某行来单独取消选择该行。我在
列表视图
上使用了
setOnItemLongClickListener
,但是
视图.isSelected
始终返回
false
,即使选中了行

有人知道为什么会这样吗

我放了日志来证明这个事实

我还浏览了一下网络,一些帖子说可能的问题是我使用的是
SimpleCursorAdapter
,它是一个太基本的组件

我不太擅长适配器、列表和触摸事件,所以有人能给我指出正确的方向吗

我想要解决的显而易见的问题是,为什么isSelected方法总是返回false

public  class  CarerListForGroupMessageFragment extends ListFragment {

    private static final String TAG =  CarerListForGroupMessageFragment.class.getSimpleName();
    RROnCallApplication rrOnCallApp;
    Cursor cursor;
    ListView listView;
    MyAdapter myAdapter;
    OnCarerForGroupMessageSelectedListener mListener;
    EditText etext;
    Button resetSearch;
    Button selectAll;
    Button deselectAll;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        rrOnCallApp = (RROnCallApplication) getActivity().getApplicationContext();

        cursor = getCarerList(null);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragmentcarerlistforgroupmessage, container, false);
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        String[] from = new String[]{DBModel.C_CARER_FIRSTNAME, DBModel.C_CARER_LASTNAME, DBModel.C_CARER_PHONENUMBER};
        int[] to = {R.id.carerrowfirstname, R.id.carerrowlastname, R.id.carerrowtelno};

        myAdapter = (MyAdapter) new MyAdapter(getActivity(),R.layout.carerrow , cursor, from, to);

        setListAdapter(myAdapter);
        getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        getListView().setFastScrollEnabled(true);
        getListView().setTextFilterEnabled(true);    

selectAll = (Button) getActivity().findViewById(R.id.carerlistselectallgroupmessage);
        selectAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {    
                for(int i = 0; i < cursor.getCount(); i++){
                    getListView().setItemChecked(i, true);
                }

                myAdapter.notifyDataSetChanged();
            }
        });

        deselectAll = (Button) getActivity().findViewById(R.id.carerlistdeselectallgroupmessage);
        deselectAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for(int i = 0; i < cursor.getCount(); i++) {
                    getListView().setItemChecked(i, false);
                }

                myAdapter.notifyDataSetChanged();
            }
        });

 getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                //Toast.makeText(getActivity(), "On long click listener", Toast.LENGTH_LONG).show();

                boolean ret = false;
                if(! view.isSelected()) {

                    //row in list is not currently selected, so set it as selected
                    Log.e(TAG, "row postion " + position + " in list is not currently selected");

                    view.setSelected(true);

                    Cursor cursor = (Cursor) getListAdapter().getItem(position);

                    String carerID = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_ID));
                    String carerFirstName = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_FIRSTNAME));
                    String carerLastName = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_LASTNAME));
                    String carerTelNo = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_PHONENUMBER));

                    Log.e(TAG, "carerID = " + carerID);

                    mListener.onCarerForGroupMessageSelected(carerID, carerFirstName, carerLastName, carerTelNo, true);

                    getListView().setItemChecked(position, true);
                    myAdapter.notifyDataSetChanged();

                    ret = true;

                } else {
                    Log.e(TAG, "row " + position + " in list is currently selected");

                    view.setSelected(false);

                    Cursor cursor = (Cursor) getListAdapter().getItem(position);

                    String carerID = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_ID));
                    String carerFirstName = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_FIRSTNAME));
                    String carerLastName = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_LASTNAME));
                    String carerTelNo = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_PHONENUMBER));

                    Log.e(TAG, "carerID = " + carerID);

                    mListener.onCarerForGroupMessageSelected(carerID, carerFirstName, carerLastName, carerTelNo, true);

                    getListView().setItemChecked(position, false);
                    myAdapter.notifyDataSetChanged();
                    ret = true;
                }

                return  ret;
            }
        });
    } // End of onActivityCreated


// Container Activity must implement this interface
public interface OnCarerForGroupMessageSelectedListener {
    public void onCarerForGroupMessageSelected(String carerId, String carerFirstName, String carerLastName, String carerTelNo ,boolean longClick);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnCarerForGroupMessageSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnCarerForGroupMessageSelectedListener");
    }
}

 @Override
public void onListItemClick(ListView l, View v, int position, long id) {
    Log.e(TAG, "in onListItemClick");
    v.setSelected(true);

    //v.setBackgroundColor(Color.parseColor("#FF0000"));

    TextView carerName = (TextView) getView().findViewById(R.id.textviewcarername);

    Cursor cursor = (Cursor) getListAdapter().getItem(position);

    String carerID = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_ID));
    String carerFirstName = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_FIRSTNAME));
    String carerLastName = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_LASTNAME));
    String carerTelNo = cursor.getString(cursor.getColumnIndex(DBModel.C_CARER_PHONENUMBER));

    Log.e(TAG, "carerID = " + carerID);

    mListener.onCarerForGroupMessageSelected(carerID, carerFirstName, carerLastName, carerTelNo, false);

    getListView().setItemChecked(position, true);
    myAdapter.notifyDataSetChanged();
}

private class MyAdapter extends SimpleCursorAdapter {

    @SuppressWarnings("deprecation")
    public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
        super(context, layout, c, from, to);
    }

    @Override
    public
    View getView(int position, View convertView, ViewGroup parent) {
        Log.e(TAG, "inside myadapter getview");
        View v = super.getView(position, convertView, parent);
        if(v == null)
            return null;

        Log.e(TAG, "clicked the listview!");

        //Cursor c = (Cursor)getItem(position);
        // String tagScanTime = c.getString(c.getColumnIndex(LoginValidate.C_TAG_SCAN_TIME));

        // ((TextView)v.findViewById(R.id.rowcarername)).setText(name + " signed " + status +" at ");

        return v;
    }
}} //end of CarerListFragment

请检查这个代码

如果(!getListView().isItemChecked(位置))

而不是

if(!view.isSelected())


并将布尔标志值保留在DBModel类中。

请检查此代码

如果(!getListView().isItemChecked(位置))

而不是

if(!view.isSelected())


并将布尔标志值保留在DBModel类中。

您所能做的就是创建一个模型类,并在其中添加布尔标志,将其命名为所选名称,然后在选择集中使用此方法检查是否已选中。长按时,将布尔值设置为选定的真值。和更新的列表行。!如果不能信任view.isSelected,请不要使用它<代码>getListView().setItemChecked(位置,true)。在设置true或false之前,只需检查项目是否被选中,然后再反转即可。@Atifabasi Hi所以我可以使用一种数据结构,如hashmap,其中键是位置。我想我以前在一行中使用复选框时就已经这样做了。如果您要创建模型类,那么对您来说很容易,因为当您单击每个对象时,您将获得它是否被选中的信息。!您所能做的就是创建一个模型类,并在其中添加布尔标志,将其命名为“已选定”,然后在“选择集”上使用该方法检查是否已选定。长按时,将布尔值设置为选定的真值。和更新的列表行。!如果不能信任view.isSelected,请不要使用它<代码>getListView().setItemChecked(位置,true)。在设置true或false之前,只需检查项目是否被选中,然后再反转即可。@Atifabasi Hi所以我可以使用一种数据结构,如hashmap,其中键是位置。我想我以前在一行中使用复选框时就已经这样做了。如果您要创建模型类,那么对您来说很容易,因为当您单击每个对象时,您将获得它是否被选中的信息。!您好,当我使用此代码时,没有isSelected方法。请在DBModel类中添加布尔标志isSelected或任何有意义的命名,并在您选择模型标志中需要设置为true的任何视图时,设置两个公共方法SetSelected(boolean)和boolean isSelected()。对不起,我不明白你说的一些话。我知道您希望我在我的数据库模型类中保留一个标志,该标志反映状态,但getListView().getAdapter().getItem(position).isSelected()在适配器类中需要一个isSelected方法。它不在那里。对不起,我没有领会你的意思。您能分享一个基本的代码示例吗?啊,等等,对不起,getListView().getAdapter().getItem(position).isSelected()返回一个带行的游标。所以你的意思是在我的DB表中添加一行来保存isSelected?我已经更新了上面的答案。您只需要保留一个标志,如果只是临时的,则不需要将其保存在数据库中。您需要将此标志保留为该类中的一个字段HI,当我使用此代码时,没有isSelected方法。请在DBModel类中添加布尔标志isSelected或任何有意义的名称,并使两个公共方法SetSelected(boolean)和boolean isSelected()当您选择任何视图时,模型标志内的时间需要为true,反之亦然。对不起,我不明白你说的一些话。我知道您希望我在我的数据库模型类中保留一个标志,该标志反映状态,但getListView().getAdapter().getItem(position).isSelected()在适配器类中需要一个isSelected方法。它不在那里。对不起,我没有领会你的意思。您能分享一个基本的代码示例吗?啊,等等,对不起,getListView().getAdapter().getItem(position).isSelected()返回一个带行的游标。所以你的意思是在我的DB表中添加一行来保存isSelected?我已经更新了上面的答案。您只需要保留一个标志,如果只是临时的,则不需要将其保存在数据库中。您需要将此标志保持为该类中的一个字段
public class DBModel {



    private static final String TAG = DBModel.class.getSimpleName();





    // table carer column names
        public static final String C_CARER_ID_INDEX = BaseColumns._ID;
        public static final String C_CARER_ID = "carerid";
        public static final String C_CARER_FIRSTNAME = "carerfirstname";
        public static final String C_CARER_LASTNAME = "carerlastname";
        public static final String C_CARER_PHONENUMBER = "carerphonenumber";
        public static final String C_CARER_EMAIL = "careremail";




Context context;
    DBHelper dbhelper;
    RROnCallApplication rrOnCallApplication;



    public DBModel(Context context) {

        this.context = context;
        dbhelper = new DBHelper();
        rrOnCallApplication = (RROnCallApplication) context.getApplicationContext();


    }






/**
     * inner class to create/open/upgrade database
     * 
     * @author matt
     * 
     */
    private class DBHelper extends SQLiteOpenHelper {

        // database name and version number
        public static final String DB_NAME = "roadrunneroncall.db";
        public static final int DB_VERSION = 3;

        // table names


        public static final String TABLECARER = "carer";


        public DBHelper() {
            super(context, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            Log.e(TAG, "SQLiteOpenHelper oncreate ");



String sqlToCreateCarerTable = String
                    .format("create table %s ( %s INTEGER primary key, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT)",
                            TABLECARER, C_CARER_ID_INDEX, C_CARER_ID, C_CARER_FIRSTNAME,
                            C_CARER_LASTNAME, C_CARER_PHONENUMBER, C_CARER_EMAIL);

            db.execSQL(sqlToCreateCarerTable);
            Log.e(TAG, "oncreate " + sqlToCreateCarerTable);

}




        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {





        }//end of onUpgrade

    }//end of DBHelper


public  SQLiteDatabase getDB(){

        return dbhelper.getWritableDatabase(RROnCallApplication.getSecretKey().toString());

    }



public void deleteTableCarer() {
        // open database
        SQLiteDatabase db = dbhelper.getWritableDatabase(RROnCallApplication.getSecretKey().toString());

        // delete contents of table
        db.delete(DBHelper.TABLECARER, null, null);

        // close database
        // db.close();
    }


    public void insertIntoCarer(ContentValues cv) {

        SQLiteDatabase db = dbhelper.getWritableDatabase(RROnCallApplication.getSecretKey().toString());

        db.insertWithOnConflict(DBHelper.TABLECARER, null, cv, SQLiteDatabase.CONFLICT_REPLACE);

        // db.close();

    }



    public Cursor queryAllFromCarer() {

        // open database
        SQLiteDatabase db = dbhelper.getReadableDatabase(RROnCallApplication.getSecretKey().toString());

        return db.query(DBHelper.TABLECARER, null, null, null, null, null, null);

    }