Android OnItemClick无法与加载的SQL数据库一起使用到ListView中 [英] Android OnItemClick not working with loaded SQL Database into listview

查看:48
本文介绍了Android OnItemClick无法与加载的SQL数据库一起使用到ListView中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个从sql数据库填充的列表视图.列表视图在一个片段下.我的数据库包含三个项目

I have a listview that is being populated from a sql database. The listview is under a fragment. My database contains three items

  • ID
  • 电话名称
  • 电话号码

我试图从列表视图中提取电话名称,并将其显示在Android的Toast显示功能中作为起点,但是当我尝试使用onItemClick从列表视图中获取电话名称时,它会完全忽略它而不执行.

where I am trying to extract the phone name from the listview and show it in the toast display function in Android as a starting point, but when I try to use onItemClick to get the phone name from the listview, it's completely ignoring it and not executing.

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.fragment_select_modem, container, false);
        btn_add = (Button) view.findViewById(R.id.btn_add);

        // Display list setup
        display_contacts1 = (ListView) view.findViewById(R.id.display_contacts);

        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(view.getContext(), android.R.layout.simple_list_item_1, display_contacts);
        display_contacts1.setAdapter(arrayAdapter);

        //--------------------------------------------------------------
        // Database Setup
        //--------------------------------------------------------------
        dbHelper = new DataDBAdapter(getActivity());
        dbHelper.open();

        // Add the data
        dbHelper.insertSomeValues();

        // Generate Listview from SQL Lite database
        displayListView();

        btn_add.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
                startActivityForResult(contactPickerIntent, PICK);
            }
        });

// This part is not working 
            display_contacts1.setOnItemClickListener(new AdapterView.OnItemClickListener()
            {

                @Override
                public void onItemClick(AdapterView<?> adapter, View view, int position, long id)
                {

                    Cursor cursor1 = (Cursor)SelectModemFragment.display_contacts1.getItemAtPosition(position);
                    String NAME = cursor1.getString(cursor1.getColumnIndex(DataDBAdapter.KEY_PHONE_NAME));
                    Toast.makeText(view.getContext(), NAME, Toast.LENGTH_SHORT).show();
                }
            });

推荐答案

您似乎正在尝试将String强制转换为Cursor行:-

It appears that your are trying to cast a String to a Cursor in the line :-

Cursor cursor1 = (Cursor)SelectModemFragment.display_contacts1.getItemAtPosition(position);

也就是说,根据 final ArrayAdapter< String> ;,位于点击位置的项目似乎是一个字符串.arrayAdapter = new ArrayAdapter< String>(view.getContext(),android.R.layout.simple_list_item_1,display_contacts);

我相信您想使用

String NAME = (String) SelectModemFragment.display_contacts1.getItemAtPosition(position);

评论

我在字符串NAME =(String)行中输入SelectModemFragment.display_contacts1.getItemAtPosition(位置);在您所说的onItemClick下,但仍然没有运气

I put in the line String NAME = (String) SelectModemFragment.display_contacts1.getItemAtPosition(position); under onItemClick as you said but still having no luck

以下是有效的代码,可以很好地复制您正在尝试的内容:-

The following is working code that very much replicates what you appear to be attempting:-

public class SelectModemFragment extends Fragment {

    private SelectModemViewModel mViewModel;
    ListView display_contacts1;
    ArrayAdapter<String> arrayAdapter;
    ArrayList<String> thelist;
    DataDBAdapter dbhelper;

    public static SelectModemFragment newInstance() {
        return new SelectModemFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.select_modem_fragment, container, false);
        display_contacts1 = view.findViewById(R.id.display_contacts1);

        dbhelper = new DataDBAdapter(view.getContext());
        AddSomeData();
        manageListView(view.getContext());
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mViewModel = ViewModelProviders.of(this).get(SelectModemViewModel.class);
        // TODO: Use the ViewModel
    }

    //Sets up the ListView if not already setup
    private void manageListView(Context context) {
        thelist = dbhelper.getAllRowsAsList(); //<<<<<<<<<< extract the list (just the phone names) from the database

        // Only setup the adapter and the ListView if the adapter hasn't been setup
        if (arrayAdapter == null) {
            // Instantiate the adapter
            arrayAdapter = new ArrayAdapter<>(context,android.R.layout.simple_list_item_1,thelist); //<<<<<<<<<< list included
            display_contacts1.setAdapter(arrayAdapter); //<<<<<<<<<< Tie the adpater to the ListView

            // Set the ListViews OnItemClick Listener
            display_contacts1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String name = arrayAdapter.getItem(position); //<<<<<<<<<< this gets the phone name
                    Toast.makeText(view.getContext(),"You clicked the phone named " + name,Toast.LENGTH_SHORT).show();
                }
            });
        } else {
            arrayAdapter.notifyDataSetChanged();
        }
    }

    // Add some testing data (only if none already exists)
    private void AddSomeData() {
        if (DatabaseUtils.queryNumEntries(dbhelper.getWritableDatabase(),DataDBAdapter.TBL_MYTABLE) < 1) {
            dbhelper.insert("Phone 1", "0000000000");
            dbhelper.insert("Phone 2", "1111111111");
        }
    }
}

如果您需要数据库助手(DataDBAdapter.java),则为:-

In Case you want the Database Helper (DataDBAdapter.java) then it is :-

public class DataDBAdapter extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb";
    public static final int DBVERSION = 1;
    public static final String TBL_MYTABLE = "mytable";
    public static final String COL_MYTABLE_ID = BaseColumns._ID;
    public static final String COl_MYTABLE_PHONENAME = "phonename";
    public static final String COL_MYTABLE_PHONENUMBER = "phonenumber";

    SQLiteDatabase mDB;


    public DataDBAdapter(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB  = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String mytable_crt_sql = "CREATE TABLE IF NOT EXISTS " + TBL_MYTABLE + "(" +
                COL_MYTABLE_ID + " INTEGER PRIMARY KEY," +
                COl_MYTABLE_PHONENAME + " TEXT, " +
                COL_MYTABLE_PHONENUMBER + " TEXT" +
                ")";
        db.execSQL(mytable_crt_sql);
    }

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

    public long insert(String phonename, String phonenumber) {
        ContentValues cv = new ContentValues();
        cv.put(COl_MYTABLE_PHONENAME,phonename);
        cv.put(COL_MYTABLE_PHONENUMBER,phonenumber);
        return mDB.insert(TBL_MYTABLE,null,cv);
    }

    public ArrayList<String> getAllRowsAsList() {
        Cursor csr = mDB.query(TBL_MYTABLE,null,null,null,null,null,null);
        ArrayList<String> rv = new ArrayList<>();
        while (csr.moveToNext()) {
            rv.add(csr.getString(csr.getColumnIndex(COl_MYTABLE_PHONENAME)));
        }
        return rv;
    }
}

结果

生成的应用程序:-

Result

The resultant App :-

(您必须相信,Toast会按预期显示)

这篇关于Android OnItemClick无法与加载的SQL数据库一起使用到ListView中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆