簡體   English   中英

如何從ListView Adapter類訪問SQLite數據庫

[英]How to Access SQLite Database from ListView Adapter class

我正在構建一個培訓日志,其中包含用戶在TrainingLogCreate中添加的兩個字符串,這些字符串將利用DBAdapter中的SQLite數據庫添加到TrainingLog中的自定義listView(lv)中。 我的問題是我想從列表視圖中刪除一行,並且為此,我需要通過自定義列表視圖適配器(TrainingAdapter)添加一個按鈕。 但是,我不確定如何從TrainingLog(主片段)訪問我的按鈕,並在那里實現onClickListener方法。 有關如何執行此操作的任何想法?

TrainingLog:

public class TrainingLog extends Fragment {

    ListView lv;
    ArrayList<String> players = new ArrayList<String>();
    ArrayAdapter<String> adapter;
    ArrayAdapter<String> clearAdapter;
    ArrayList<String> details = new ArrayList<String>();    

    public TrainingLog() {
        // Required empty public constructor
    }    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View rootView = inflater.inflate(R.layout.fragment_training_log, container, false);
        lv = (ListView) rootView.findViewById(R.id.myListView);
        final DBAdapter db = new DBAdapter(this.getActivity());    

        setHasOptionsMenu(true);    
        players.clear();    
        //OPEN
        db.openDB();    
        //RETRIEVE
        Cursor c=db.getAllNames();    
        while(c.moveToNext())
        {
            String name=c.getString(1);
            players.add(name);
            String pos=c.getString(2);
            details.add(pos);
        }    
        db.close();  

        //TrainingAdapter adapter = new TrainingAdapter(this, players);  
        //adapter=new ArrayAdapter<String>(this.getActivity(),android.R.layout.simple_selectable_list_item,players);
        //lv.setAdapter(adapter);
         //ListAdapter myTrainingAdapter = new TrainingAdapter(this.getActivity(), players);    
       //lv.setAdapter(myTrainingAdapter);

        String[] playerArray = new String[players.size()];
        playerArray = players.toArray(playerArray);

        String[] detailArray =  new String[details.size()];
        detailArray = details.toArray(detailArray);

        ListAdapter myAdapter = new TrainingAdapter(this.getActivity(), playerArray, detailArray);
        lv.setAdapter(myAdapter);

        return rootView;
    }    

    @Override
    public void onResume() {
        super.onResume();    
        final DBAdapter db = new DBAdapter(this.getActivity());    
        players.clear();    
        ///OPEN
        db.openDB();    

        //RETRIEVE
        Cursor c=db.getAllNames();

        while(c.moveToNext())
        {
            String name=c.getString(1);
            players.add(name);
            String pos=c.getString(2);
            details.add(pos);
        }    

        db.close();

        /* adapter=new ArrayAdapter<String>(this.getActivity(),android.R.layout.simple_selectable_list_item,players);
lv.setAdapter(adapter); */

        String[] playerArray = new String[players.size()];
        playerArray = players.toArray(playerArray);

        String[] detailArray =  new String[details.size()];
        detailArray = details.toArray(detailArray);

        ListAdapter myAdapter = new TrainingAdapter(this.getActivity(), playerArray, detailArray);
        lv.setAdapter(myAdapter);    
    }

    private void loadFragment()
    {
}

    @Override
    public void onCreateOptionsMenu(
            Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.traning_menu_itemdetail, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // handle item selection
        switch (item.getItemId()) {
            case R.id.action_add:
                Intent trainingCreateIntent = new Intent (getContext(), TrainingLogCreate.class);
                startActivity(trainingCreateIntent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

TrainingLogCreate:

public class TrainingLogCreate extends AppCompatActivity {
    EditText nameTxt;
    EditText posTxt;
    Button savebtn;
    Context context = this;

    public TrainingLogCreate() {
        // Required empty public constructor
    }

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

        setContentView(R.layout.training_log_create);

        savebtn = (Button) findViewById(R.id.saveButton);
        nameTxt = (EditText) findViewById(R.id.exercizeActivity);
        posTxt = (EditText) findViewById(R.id.exercizeDetails);
        final DBAdapter db=new DBAdapter(this);
        savebtn.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                // TODO Auto-generated method stub

                //OPEN
                db.openDB();

                //INSERT
                long result=db.add(nameTxt.getText().toString(), posTxt.getText().toString());

                if(result > 0)
                {
                    nameTxt.setText("");
                    posTxt.setText("");
                }else
                {
                    Toast.makeText(getApplicationContext(), "Failure", Toast.LENGTH_SHORT).show();
                }
                //CLOSE DB
                db.close();

                //Close Fragment


                finish();    
            }
        });    
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater mif = getMenuInflater();
        mif.inflate(R.menu.training_create_menu, menu);
        getActionBar().show();
        return super.onCreateOptionsMenu(menu);    
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // handle item selection
        switch (item.getItemId()) {
            case R.id.action_save:
                //add save functionality
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

TrainingAdapter:

public class TrainingAdapter extends ArrayAdapter<String> {    
    private final String[] playerArray;
    private final String[] detailArray;
    Button removeButton;    
    TrainingAdapter(FragmentActivity context, String[] playerArray, String[] detailArray) {
        super(context, R.layout.training_row, playerArray);   
        this.playerArray = playerArray;
        this.detailArray = detailArray;    
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater JohnsInflater = LayoutInflater.from(getContext());
        View customView = JohnsInflater.inflate(R.layout.training_row, parent, false);
        TextView exercizeTextView = (TextView) customView.findViewById(R.id.exercizeTextView);
        TextView detailTextView = (TextView) customView.findViewById(R.id.detailTextView);
        Button removeButton = (Button) customView.findViewById(R.id.deleteButton);

        removeButton.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                final DBAdapter db = new DBAdapter();

             }
         });

        exercizeTextView.setText(playerArray[position]);
        detailTextView.setText(detailArray[position]);    

        return customView;
    }
}

DBAdapter:

 public class DBAdapter {

    //COLUMNS
    static final String ROWID="id";
    static final String NAME = "name";
    static final String POSITION = "position";

    //DB PROPERTIES
    static final String DBNAME="m_DB";
    static final String TBNAME="m_TB";
    static final int DBVERSION='1';

    static final String CREATE_TB="CREATE TABLE m_TB(id INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "name TEXT NOT NULL,position TEXT NOT NULL);";

    final Context c;
    SQLiteDatabase db;
    DBHelper helper;

    public DBAdapter(FragmentActivity ctx) {
        // TODO Auto-generated constructor stub

        this.c=ctx;
        helper=new DBHelper(c);
    }

    // INNER HELPER DB CLASS
    private static class DBHelper extends SQLiteOpenHelper
    {

        public DBHelper(Context context ) {
            super(context, DBNAME, null, DBVERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            try
            {
                db.execSQL(CREATE_TB);
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

            Log.w("DBAdapetr","Upgrading DB");

            db.execSQL("DROP TABLE IF EXISTS m_TB");

            onCreate(db);
        }    
    }

    // OPEN THE DB
    public DBAdapter openDB()
    {
        try
        {
            db=helper.getWritableDatabase();

        }catch(SQLException e)
        {
            Toast.makeText(c, e.getMessage(), Toast.LENGTH_LONG).show();
        }

        return this;
    }    

    //CLOSE THE DB
    public void close()
    {
        helper.close();
    }

    //INSERT INTO TABLE
    public long add(String name,String pos)
    {
        try
        {
            ContentValues cv=new ContentValues();
            cv.put(NAME, name);
            cv.put(POSITION, pos);

            return db.insert(TBNAME, ROWID, cv);

        }catch(SQLException e)
        {
            e.printStackTrace();
        }

        return 0;
    }

    //REMOVE FROM TABLE
    public long remove(String name,String pos)
    {
        try
        {
            ContentValues cv=new ContentValues();
            cv.remove(name);
            cv.remove(pos);

            return db.insert(TBNAME, ROWID, cv);

        }catch(SQLException e)
        {
            e.printStackTrace();
        }

        return 0;
    }    

    //GET ALL VALUES    
    public Cursor getAllNames()
    {
        String[] columns={ROWID,NAME,POSITION};

        return db.query(TBNAME, columns, null, null, null, null, null);
    }
}

使用接口或廣播,您可以做到這一點。

創建一個接口,它將解決問題。

  private View.OnClickListener delete;
 public void setDelete(View.OnClickListener delete){
        this.delete= delete;
    }
      removeButton.setTag(position);
    removeButton.setOnClickListener(delete);

現在在您的活動類中實現onClickListener並調用適配器的方法

public class TrainingLogCreate extends AppCompatActivity implements View.OnClickListener{

  @Override
 public void onClick(View view) {
     Object tag = (Integer) view.getTag();
     switch (view.getId()){
         case R.id.deleteButton:
          if (tag != null && tag instanceof Integer) {

                 int position = (Integer) tag;
         SQLiteDatabase dataBase = db.getWritableDatabase();
        dataBase.delete(DBAdapter.TABLE_NAME,
     DBAdapter.POSITION +"="+position, null);
            yourlistAdapter.notifyDataSetChanged();

試試看,讓我知道是否發生任何問題。

暫無
暫無

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

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