RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-233150

Вероника's questions

Martin Hope
Вероника
Asked: 2020-02-16 04:19:02 +0000 UTC

组的自定义视图 ExpandableListView

  • 0

请告诉我.. 我在ExpandableListView. 我在适配器中写了以下内容:

public class ExpListAdapter extends SimpleCursorTreeAdapter {

    DBHeler dbHeler;
    private int layout;

    public ExpListAdapter(Context context, Cursor cursor, int groupLayout, String[] groupFrom, int[] groupTo, int childLayout, String[] childFrom, int[] childTo) {
        super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childFrom, childTo);
        this.layout = childLayout;
    }


    @Override
    public View newGroupView(Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) {
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
      View view = inflater.inflate(layout, parent, false);
      ViewHolder viewHolder = new ViewHolder(view);
      view.setTag(viewHolder);
      return view;
   }

   @Override
   protected void bindGroupView(View view, Context context, Cursor cursor, boolean isExpanded) {
      super.bindGroupView(view, context, cursor, isExpanded);

      ViewHolder holder = (ViewHolder) view.getTag();
      String category = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_NAME));
      holder.txtCategory.setText(category);
   }


}

我收到一个错误:

进程:test.myapp,PID:6572 java.lang.NullPointerException:尝试在 test.myapp.ExpListAdapter.bindGroupView 的空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)” (ExpListAdapter.java:82)

android
  • 1 个回答
  • 10 Views
Martin Hope
Вероника
Asked: 2020-02-14 16:52:23 +0000 UTC

如何为下拉元素制作自定义视图

  • 2

有一个下拉列表ExpandableListView,里面显示了国家和他们的景点。标题是国家/地区,当您单击国家/地区时,会打开一个包含景点的下拉列表。

如何为这些下拉元素本身制作自定义视图。

为下拉列表中的每个项目创建标记

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">

        <de.hdodenhof.circleimageview.CircleImageView
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/img"
            android:src="@drawable/bg"
            app:civ_border_color="#FF000000"
            android:layout_width="42dp"
            android:layout_height="42dp"
            android:scaleType="centerCrop" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:paddingLeft="8dp"
            android:paddingRight="8dp">

            <TextView
                android:text=""
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/txtTitle"
                android:layout_weight="1"
                android:gravity="left|center" />

            <TextView
                android:text=""
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/txtHistory"
                android:layout_weight="1"
                android:singleLine="true" />
        </LinearLayout>

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:srcCompat="@drawable/icon_star_outline_black"
            android:id="@+id/btnfavorite"
            android:background="@drawable/white_button"
            android:focusable="false"
            android:onClick="onFavoriteClick" />

    </LinearLayout>
</LinearLayout>

数据库助手类

public class DBHeler extends SQLiteOpenHelper {
    private static String DB_PATH;
    private static final String DATABASE_NAME = "mydb.db";
    private static final int DATABASE_VERSION = 1;
    public SQLiteDatabase database;
    private Context myContext;

    public DBHeler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.myContext = context;
        try {
            //получаем путь до БД вместе с именем.
            DB_PATH = myContext.getDatabasePath(DATABASE_NAME).toString();
            createDataBase();
            openDataBase();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Cursor getCategoryData() {
        return this.getReadableDatabase().query(Contract.Entry.TABLE_COUNTRY, null, null, null, null, null, null);
    }

    public Cursor getSubCategoryData(long categoryID) {
        return this.getReadableDatabase().query(Contract.Entry.TABLE_DOST, null, Contract.Entry._ID + " = "
                + categoryID, null, null, null, null);
    }

    public void createDataBase() throws IOException {

        boolean dbExist = checkDataBase();

        if (!dbExist) {
            this.getReadableDatabase();
            try {
                copyDataBase();
            }
            catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

    private boolean checkDataBase(){
        SQLiteDatabase checkDB = null;
        try {

            checkDB = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READONLY);
        }
        catch (SQLiteException e) {
            // база не существует
        }
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null;
    }

    private void copyDataBase() throws IOException {
        InputStream myInput = myContext.getAssets().open(DATABASE_NAME);

        String outFileName = DB_PATH;

        OutputStream myOutput = new FileOutputStream(outFileName);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    public void openDataBase() throws SQLException {
        database = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE);
    }

    @Override
    public synchronized void close() {
        if(database != null)
            database.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

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

    }
}

主要活动类

public class MainActivity extends AppCompatActivity {

    ExpandableListView elvMain;
    DBHeler db;

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

        db = new DBHeler(this);

        Cursor categoryData = db.getCategoryData();

        startManagingCursor(categoryData);

        String[] groupFrom = { Contract.Entry.COLUMN_NAME };
        int[] groupTo = { android.R.id.text1 };

        String[] childFrom = { Contract.Entry.COLUMN_NAME };
        int[] childTo = { android.R.id.text1  };

        SimpleCursorTreeAdapter sctAdapter = new MyAdapter(this, categoryData,
                android.R.layout.simple_expandable_list_item_1, groupFrom,
                groupTo, android.R.layout.simple_list_item_1, childFrom,
                childTo);

        elvMain = (ExpandableListView) findViewById(R.id.list);

        elvMain.setAdapter(sctAdapter);
    }

    public class MyAdapter extends SimpleCursorTreeAdapter {

        public MyAdapter(Context context, Cursor cursor, int groupLayout,
                         String[] groupFrom, int[] groupTo, int childLayout,
                         String[] childFrom, int[] childTo) {
            super(context, cursor, groupLayout, groupFrom, groupTo,
                    childLayout, childFrom, childTo);
        }

        protected Cursor getChildrenCursor(Cursor groupCursor) {
            int idColumn = groupCursor.getColumnIndex(Contract.Entry._ID);
            return db.getSubCategoryData(groupCursor.getInt(idColumn));
        }
    }
}

Contract 类,描述字段和列名

public class Contract {
    private Contract() {
    };

    public static final class Entry implements BaseColumns {
        public final static String TABLE_DOST = "dost";
        public final static String TABLE_COUNTRY = "country";

        public final static String _ID = BaseColumns._ID;
        public final static String COLUMN_NAME = "name";
        public final static String COLUMN_OTHER = "other";
        public final static String COLUMN_HISTORY = "history";
        public final static String COLUMN_IMAGE = "image";
        public final static String COLUMN_COUNTRY = "name";
        public final static String COLUMN_COUNTRYID = "countryid";
        public final static String COLUMN_FAVORITES = "favorites";
    }
}

在此处输入图像描述 在此处输入图像描述

android
  • 1 个回答
  • 10 Views
Martin Hope
Вероника
Asked: 2020-01-14 03:07:09 +0000 UTC

将文本从 TextView 复制到剪贴板

  • 2

如何在单击按钮时将文本从 TextView 复制到剪贴板?

android
  • 1 个回答
  • 10 Views
Martin Hope
Вероника
Asked: 2020-01-09 04:53:59 +0000 UTC

使用 CursorLoader 时过滤 ListView 数据

  • 9

有AutoCompleteTextView和的活动ListView。ListView数据通过其适配器输出。

如何使y方法执行onTextChanged时, in中的AutoCompleteTextView数据ListView变化如下: 即,ListView只有那些以我们输入的字符集开头的词AutoCompleteTextView?我知道您每次都需要更新游标的内容,但我不知道该怎么做。

DBHelper代码

public class DBHeler extends SQLiteOpenHelper {
    private static String DB_PATH = "/data/data/tests.mytest3/databases/";
    private static final String DATABASE_NAME = "dbase.db";
    private static final int DATABASE_VERSION = 1;
    public SQLiteDatabase database;
    private Context myContext;

    final String ruQuery = "SELECT * " + " FROM " + Contract.Entry.TABLE_RUEN;
    final String enQuery = "SELECT * " + " FROM " + Contract.Entry.TABLE_ENRU;

    public DBHeler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.myContext = context;
    }

    public Cursor getRuWords() {
        return database.rawQuery(ruQuery, null); 
    }

    public Cursor getEnWords() {
        return database.rawQuery(enQuery, null); 
    }

    public void createDataBase() throws IOException {
        boolean dbExist = checkDataBase();

        if(dbExist){
            //ничего не делать - база уже есть
        }else{
            //вызывая этот метод создаем пустую базу, позже она будет перезаписана
            this.getReadableDatabase();

            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

    private boolean checkDataBase(){
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DATABASE_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        } catch(SQLiteException e){
            //база еще не существует
        }
        if(checkDB != null){
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    private void copyDataBase() throws IOException{
        InputStream myInput = myContext.getAssets().open(DATABASE_NAME);

        String outFileName = DB_PATH + DATABASE_NAME;

        OutputStream myOutput = new FileOutputStream(outFileName);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    public void openDataBase() throws SQLException {
        String myPath = DB_PATH + DATABASE_NAME;
        database = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    }

    @Override
    public synchronized void close() {
        if(database != null)
            database.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

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

    }
}

合约类

    public class Contract {
        private Contract() {
        };

        public static final class Entry implements BaseColumns {
            public final static String TABLE_RUEN = "ruen";
            public final static String TABLE_ENRU = "enru";

            public final static String _ID = BaseColumns._ID;
            public final static String COLUMN_SLOVO = "word";
            public final static String COLUMN_PEREVOD = "translation";
            public final static String COLUMN_IZBRANNOE = "favorites";
        }
    }

适配器类

public class MySimpleCursorAdapter extends SimpleCursorAdapter {

    private int layout;

    public MySimpleCursorAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to, int flag) {
        super(context, layout, cursor, from, to, flag);
        this.layout = layout;
    }

    public static class ViewHolder {
        public TextView txtBukva;
        public TextView txtPerevod;
        public TextView txtSlovo;
        public ImageButton btnIzbrannoe;

        public ViewHolder(View view) {
            txtBukva = (TextView) view.findViewById(R.id.txtBukva);
            txtSlovo = (TextView) view.findViewById(R.id.txtSlovo);
            txtPerevod = (TextView) view.findViewById(R.id.txtPerevod);
            btnIzbrannoe = (ImageButton) view.findViewById(R.id.btnIzbrannoe);
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(layout, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        view.setTag(viewHolder);
        return view;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        ViewHolder holder = (ViewHolder) view.getTag();

        String bukva = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO)).substring(0, 1).toUpperCase();
        String slovo = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO));
        String perevod = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_PEREVOD));
        String izbrannoe = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_IZBRANNOE));
        int _ID = cursor.getInt(cursor.getColumnIndex(Contract.Entry._ID));

        TextView txtBukva = (TextView) view.findViewById(R.id.txtBukva);
        TextView txtSlovo = (TextView) view.findViewById(R.id.txtSlovo);
        TextView txtPerevod = (TextView) view.findViewById(R.id.txtPerevod);
        ImageButton btnIzbrannoe = (ImageButton) view.findViewById(R.id.btnIzbrannoe);

        holder.txtBukva.setText(bukva);
        holder.txtSlovo.setText(slovo);
        holder.txtPerevod.setText(perevod);
        holder.btnIzbrannoe.setFocusable(false);

        if (izbrannoe.equals("1")) {
            holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_yellow);
        } else {
            holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_outline_black);
        }

        holder.btnIzbrannoe.setTag(new Slovo(_ID,slovo, perevod,bukva,izbrannoe));
    }
}

主要活动

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    private EditText txtSearch;
    private Spinner spinner;
    private ListView list;
    private ImageButton btnClear;

    DBHeler db;
    private MySimpleCursorAdapter cursorAdapter;

    final private static int LOADER_RUS = 0;
    final private static int LOADER_ENG = 1;

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

        db = new DBHeler(this);

        try {
            db.createDataBase();
            db.openDataBase();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        spinner = (Spinner) findViewById(R.id.spinner);
        txtSearch = (EditText) findViewById(R.id.txtSearch);
        list = (ListView) findViewById(R.id.list);
        btnClear = (ImageButton) findViewById(R.id.btnClear);

        ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(this, R.array.types, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        String[] from = new String[] {Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_PEREVOD, Contract.Entry.COLUMN_IZBRANNOE};
        int[] to = new int[] {R.id.txtBukva, R.id.txtSlovo, R.id.txtPerevod, R.id.btnIzbrannoe};

        cursorAdapter = new MySimpleCursorAdapter(this, R.layout.item, null, from, to, 0);

        list.setAdapter(cursorAdapter);

        // инициализируем оба загрузчика
        getSupportLoaderManager().initLoader(LOADER_RUS, null, this);
        getSupportLoaderManager().initLoader(LOADER_ENG, null, this);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int loadID, long l) {
                getSupportLoaderManager().getLoader(loadID).forceLoad(); // обновляем данные в курсоре
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(MainActivity.this, SlovoActivity.class);
                CharSequence strCharSequence = ((TextView)view.findViewById(R.id.txtSlovo)).getText();
                String str = strCharSequence.toString().toLowerCase().trim();
                String selectedItem = spinner.getSelectedItem().toString();
                if (selectedItem.equals("С русского на английский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "RU");
                    startActivity(intent);
                } else if (selectedItem.equals("С английского на русский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "EN");
                    startActivity(intent);
                }
            }
        });
    }

    public void onFavoriteClick(View view) {

        Slovo data = (Slovo)view.getTag();
        long id = data.id;
        String slovo = data.word;
        String perevod = data.perevod;
        String bukva = data.simbol;
        boolean izbrannoe = data.favorite;

        String selectedItem = spinner.getSelectedItem().toString();
        if (selectedItem.equals("С русского на английский")) {
            if (!izbrannoe) {
                ContentValues values = new ContentValues();
                values.put(Contract.Entry.COLUMN_IZBRANNOE, "1");

                // Вставляем новый ряд в базу данных и запоминаем его идентификатор
                long newRowId = db.database.update(Contract.Entry.TABLE_RUEN, values, Contract.Entry.COLUMN_SLOVO + "= ?", new String[]{slovo});
                //izbrannoe = true;
                // Выводим сообщение в успешном случае или при ошибке
                if (newRowId == -1) { // Если ID  -1, значит произошла ошибка
                    Toast.makeText(this, "Ошибка", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "Добавлено в избранное", Toast.LENGTH_SHORT).show();
                    getSupportLoaderManager().getLoader(LOADER_RUS).forceLoad();
                }
            } else if (izbrannoe) {
                ContentValues values = new ContentValues();
                values.put(Contract.Entry.COLUMN_IZBRANNOE, "0");

                // Вставляем новый ряд в базу данных и запоминаем его идентификатор
                long newRowId = db.database.update(Contract.Entry.TABLE_RUEN, values, Contract.Entry.COLUMN_SLOVO + "= ?", new String[]{slovo});
                //izbrannoe = true;
                // Выводим сообщение в успешном случае или при ошибке
                if (newRowId == -1) { // Если ID  -1, значит произошла ошибка
                    Toast.makeText(this, "Ошибка", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "Удалено из избранного", Toast.LENGTH_SHORT).show();
                    getSupportLoaderManager().getLoader(LOADER_RUS).forceLoad();
                }
            }
        } else if (selectedItem.equals("С английского на русский")) {
            if (!izbrannoe) {
                ContentValues values = new ContentValues();
                values.put(Contract.Entry.COLUMN_IZBRANNOE, "1");

                // Вставляем новый ряд в базу данных и запоминаем его идентификатор
                long newRowId = db.database.update(Contract.Entry.TABLE_ENRU, values, Contract.Entry.COLUMN_SLOVO + "= ?", new String[]{slovo});
                //izbrannoe = true;
                // Выводим сообщение в успешном случае или при ошибке
                if (newRowId == -1) { // Если ID  -1, значит произошла ошибка
                    Toast.makeText(this, "Ошибка", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "Добавлено в избранное", Toast.LENGTH_SHORT).show();
                    getSupportLoaderManager().getLoader(LOADER_ENG).forceLoad();
                }
            } else if (izbrannoe) {
                ContentValues values = new ContentValues();
                values.put(Contract.Entry.COLUMN_IZBRANNOE, "0");

                // Вставляем новый ряд в базу данных и запоминаем его идентификатор
                long newRowId = db.database.update(Contract.Entry.TABLE_ENRU, values, Contract.Entry.COLUMN_SLOVO + "= ?", new String[]{slovo});
                //izbrannoe = true;
                // Выводим сообщение в успешном случае или при ошибке
                if (newRowId == -1) { // Если ID  -1, значит произошла ошибка
                    Toast.makeText(this, "Ошибка", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "Удалено из избранного", Toast.LENGTH_SHORT).show();
                    getSupportLoaderManager().getLoader(LOADER_ENG).forceLoad();
                }
            }
        }
    }

    protected void onDestroy() {
        super.onDestroy();
        db.close();
    }

    static class MyCursorLoader extends CursorLoader {
        Cursor cursor;
        DBHeler dbHeler;
        final int loaderID;

        public MyCursorLoader(Context context, DBHeler dbHeler, int id) {
            super(context);
            this.dbHeler = dbHeler;
            loaderID = id;
        }

        @Override
        protected Cursor onLoadInBackground() {
            switch (loaderID) {
                case LOADER_RUS:
                    cursor = dbHeler.getRuWords();
                    break;
                case LOADER_ENG:
                    cursor = dbHeler.getEnWords();
                    break;
            }
            return cursor;
        }
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new MyCursorLoader(this, db, id);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        cursorAdapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        cursorAdapter.swapCursor(null);
    }
}

斯洛沃班

public class Slovo {
    long id;
    String word;
    String perevod;
    String simbol;
    boolean favorite;

    public Slovo(long id, String word, String perevod, String simbol, String favorite) {
        this.id = id;
        this.word = word;
        this.perevod = perevod;
        this.simbol = simbol;
        this.favorite = (favorite.equals("1"))? true:false;
    }
}
java
  • 1 个回答
  • 10 Views
Martin Hope
Вероника
Asked: 2020-01-09 00:33:24 +0000 UTC

如何通过 View 标签将数据从适配器传递到 Activity

  • 1

我正在尝试以 这个答案Activity的方式传输数据。该数组现在始终具有最后一个元素。myStrListView

我的适配器代码:

public class MyCursorAdapter extends CursorAdapter {

    private int layout; //нужен для создания объектов класса View

    String[] myStr = new String[3];

    //OnFavoriteListener callback;

    public MyCursorAdapter(Context context, int layout, Cursor c, int flags) {
        super(context, c, flags);
        this.layout = layout;
    }

    public static class ViewHolder {
        public TextView txtBukva;
        public TextView txtSlovo;
        public ImageButton btnIzbrannoe;

        public void setBtnIzbrannoe(ImageButton btnIzbrannoe) {
            this.btnIzbrannoe = btnIzbrannoe;
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(layout, parent, false);
        return view;
    }

    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
        final ViewHolder holder = new ViewHolder();
        String bukva = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO)).substring(0, 1).toUpperCase();
        final String slovo = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO));
        final String izbrannoe = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_IZBRANNOE));
        int _ID = cursor.getInt(cursor.getColumnIndex(Contract.Entry._ID));

        holder.txtBukva = (TextView) view.findViewById(R.id.txtBukva);
        holder.txtSlovo = (TextView) view.findViewById(R.id.txtSlovo);
        holder.btnIzbrannoe = (ImageButton) view.findViewById(R.id.btnIzbrannoe);

        holder.txtBukva.setText(bukva);
        holder.txtSlovo.setText(slovo);
        holder.btnIzbrannoe.setFocusable(false);

        if (izbrannoe.equals("1")) {
            holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_yellow);
        } else if (izbrannoe.equals("0")) {
            holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_outline_black);
        }

        myStr[0] = _ID + "";
        myStr[1] = slovo;
        myStr[2] = izbrannoe;

        holder.btnIzbrannoe.setTag(myStr);

    }

}

如何传输点击项对应的数据?

这是 MainActivity 中的代码

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    private AutoCompleteTextView txtSearch;
    private Spinner spinner;
    private ListView list;
    private ImageButton btnClear;

    DBHeler db;
    private MySimpleCursorAdapter cursorAdapter;

    final private static int LOADER_RUS = 0; //0 - потому что в spinner первое значение имеет id 0
    final private static int LOADER_ENG = 1; //1 - потому что в spinner первое значение имеет id 1

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

        db = new DBHeler(this);

        try {
            db.createDataBase();
            db.openDataBase();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        spinner = (Spinner) findViewById(R.id.spinner);
        txtSearch = (AutoCompleteTextView) findViewById(R.id.txtSearch);
        list = (ListView) findViewById(R.id.list);
        btnClear = (ImageButton) findViewById(R.id.btnClear);

        ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(this, R.array.types, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        String[] from = new String[] {Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_PEREVOD, Contract.Entry.COLUMN_IZBRANNOE};
        int[] to = new int[] {R.id.txtBukva, R.id.txtSlovo, R.id.txtPerevod, R.id.btnIzbrannoe};

        cursorAdapter = new MySimpleCursorAdapter(this, R.layout.item, null, from, to, 0);

        list.setAdapter(cursorAdapter);

        // инициализируем оба загрузчика
        getSupportLoaderManager().initLoader(LOADER_RUS, null, this);
        getSupportLoaderManager().initLoader(LOADER_ENG, null, this);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            /*При выборе пункта в спинере обновление загрузчика происходит по нажатой позиции (а не по содержимому пункта списка) -
            третий аргумент колбэка с именем loadID в данном коде передает позицию выбранного пункта.
            Позиция может быть 0 или 1, ID наших загрузчиков так же 0 или 1 для русского и английского набора соответственно.*/
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int loadID, long l) {
                getSupportLoaderManager().getLoader(loadID).forceLoad(); // обновляем данные в курсоре
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(MainActivity.this, SlovoActivity.class);
                CharSequence strCharSequence = ((TextView)view.findViewById(R.id.txtSlovo)).getText();
                String str = strCharSequence.toString().toLowerCase().trim();
                String selectedItem = spinner.getSelectedItem().toString();
                if (selectedItem.equals("С русского на английский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "RU");
                    startActivity(intent);
                } else if (selectedItem.equals("С английского на русский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "EN");
                    startActivity(intent);
                }
            }
        });

        txtSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                String[] from = new String[] {Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_PEREVOD, Contract.Entry.COLUMN_IZBRANNOE};
                int[] to = new int[] {R.id.txtBukva, R.id.txtSlovo, R.id.txtPerevod, R.id.btnIzbrannoe};
                cursorAdapter = new MySimpleCursorAdapter(MainActivity.this, R.layout.item, null, from, to, 0); list.setAdapter(cursorAdapter);
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
    }

    public void onFavoriteClick(View view) {

        Slovo data = (Slovo)view.getTag();
        long id = data.id;
        String slovo = data.word;
        String perevod = data.perevod;
        String bukva = data.simbol;
        boolean izbrannoe = data.favorite;

        //System.out.println(id + " " + slovo + " " + perevod + " " + bukva + " " + izbrannoe);

        if (izbrannoe == false) {
            ContentValues values = new ContentValues();
            values.put(Contract.Entry.COLUMN_IZBRANNOE, "1");

            // Вставляем новый ряд в базу данных и запоминаем его идентификатор
            long newRowId = db.database.update(Contract.Entry.TABLE_RUEN, values, Contract.Entry.COLUMN_SLOVO + "= ?", new String[]{slovo});
            izbrannoe = true;
            // Выводим сообщение в успешном случае или при ошибке
            if (newRowId == -1) { // Если ID  -1, значит произошла ошибка
                Toast.makeText(this, "Ошибка", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Добавлено в избранное", Toast.LENGTH_SHORT).show();
                getSupportLoaderManager().getLoader(LOADER_RUS).forceLoad();
            }
        } else if (izbrannoe == true) {
            ContentValues values = new ContentValues();
            values.put(Contract.Entry.COLUMN_IZBRANNOE, "0");

            // Вставляем новый ряд в базу данных и запоминаем его идентификатор
            long newRowId = db.database.update(Contract.Entry.TABLE_RUEN, values, Contract.Entry.COLUMN_SLOVO + "= ?", new String[]{slovo});
            izbrannoe = true;
            // Выводим сообщение в успешном случае или при ошибке
            if (newRowId == -1) { // Если ID  -1, значит произошла ошибка
                Toast.makeText(this, "Ошибка", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Удалено из избранного", Toast.LENGTH_SHORT).show();
                getSupportLoaderManager().getLoader(LOADER_RUS).forceLoad();
            }
        }
    }

    public void onClearBtnClick(View view) {
        txtSearch.setText("");
        btnClear.setVisibility(View.INVISIBLE);
    }

    protected void onDestroy() {
        super.onDestroy();
        db.close();
    }

    static class MyCursorLoader extends CursorLoader {
        Cursor cursor;
        DBHeler dbHeler;
        final int loaderID;

        public MyCursorLoader(Context context, DBHeler dbHeler, int id) {
            super(context);
            this.dbHeler = dbHeler;
            loaderID = id;
        }

        @Override
        protected Cursor onLoadInBackground() {
            switch (loaderID) {
                case LOADER_RUS:
                    cursor = dbHeler.getRuWords();
                    break;
                case LOADER_ENG:
                    cursor = dbHeler.getEnWords();
                    break;
            }
            return cursor;
        }
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new MyCursorLoader(this, db, id);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        cursorAdapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        cursorAdapter.swapCursor(null);
    }
}
java
  • 1 个回答
  • 10 Views
Martin Hope
Вероника
Asked: 2020-01-08 04:56:09 +0000 UTC

如何处理 Activity 中嵌套在 ListView 项目中的小部件的点击?

  • 2

ImageButton 在单独的适配器类中定义。我想从 MainActivity 引用它,以实现将项目从 Listview 添加到收藏夹。如何联系我?

这是适配器类

public class MyCursorAdapter extends CursorAdapter {

    private int layout; //нужен для создания объектов класса View

    public MyCursorAdapter(Context context, int layout, Cursor c, int flags) {
        super(context, c, flags);
        this.layout = layout;
    }

    public static class ViewHolder {
        public TextView txtBukva;
        public TextView txtSlovo;
        public ImageButton btnIzbrannoe;

        public void setBtnIzbrannoe(ImageButton btnIzbrannoe) {
            this.btnIzbrannoe = btnIzbrannoe;
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(layout, parent, false);
        return view;
    }

    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
        ViewHolder holder = new ViewHolder();
        String bukva = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO)).substring(0, 1).toUpperCase();
        String slovo = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO));
        String izbrannoe = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_IZBRANNOE));

        holder.txtBukva = (TextView) view.findViewById(R.id.txtBukva);
        holder.txtSlovo = (TextView) view.findViewById(R.id.txtSlovo);
        holder.btnIzbrannoe = (ImageButton) view.findViewById(R.id.btnIzbrannoe);

        holder.txtBukva.setText(bukva);
        holder.txtSlovo.setText(slovo);
        holder.btnIzbrannoe.setFocusable(false);

        if (izbrannoe.equals("1")) {
            holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_yellow);
        } else if (izbrannoe.equals("0")) {
            holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_outline_black);
        }
    }

}
android
  • 3 个回答
  • 10 Views
Martin Hope
Вероника
Asked: 2020-01-08 03:40:54 +0000 UTC

通过 CursorLoader 的两个游标

  • 0

如何通过 cursorloader 连接两个游标?到目前为止,我有以下内容

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    private AutoCompleteTextView txtSearch;
    private Spinner spinner;
    private ListView list;
    private ImageButton btnClear;

    DBHeler db;

    private MyCursorAdapter cursorAdapter;

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

        db = new DBHeler(this);

        try {
            db.createDataBase();
            db.openDataBase();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        spinner = (Spinner) findViewById(R.id.spinner);
        // Настраиваем адаптер
        ArrayAdapter<?> adapter =
                ArrayAdapter.createFromResource(this, R.array.types, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Вызываем адаптер
        spinner.setAdapter(adapter);

        txtSearch = (AutoCompleteTextView) findViewById(R.id.txtSearch);
        list = (ListView) findViewById(R.id.list);
        btnClear = (ImageButton) findViewById(R.id.btnClear);

        /*Выводим в список все слова, при запуске программы*/
        String selectedItem = spinner.getSelectedItem().toString();
        if (selectedItem.equals("С русского на английский")) {
            cursorAdapter = new MyCursorAdapter(this, R.layout.item, null, 0);
            list.setAdapter(cursorAdapter);
        } else if (selectedItem.equals("С английского на русский")) {
            cursorAdapter = new MyCursorAdapter(this, R.layout.item, null, 0);
            list.setAdapter(cursorAdapter);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        txtSearch.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if (b && txtSearch.getText().toString().length() > 0)
                    btnClear.setVisibility(View.VISIBLE);
                else
                    btnClear.setVisibility(View.INVISIBLE);
            }
        });

        txtSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                if(charSequence.length() != 0){
                    btnClear.setVisibility(View.VISIBLE);
                }else{
                    btnClear.setVisibility(View.INVISIBLE);
                }


            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(MainActivity.this, SlovoActivity.class);
                CharSequence strCharSequence = ((TextView)view.findViewById(R.id.txtSlovo)).getText();
                String str = strCharSequence.toString().toLowerCase().trim();
                String selectedItem = spinner.getSelectedItem().toString();
                if (selectedItem.equals("С русского на английский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "RU");
                    startActivity(intent);
                } else if (selectedItem.equals("С английского на русский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "EN");
                    startActivity(intent);
                }
            }
        });

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                txtSearch.setText("");
                String str = adapterView.getItemAtPosition(i).toString();
                if (str.equals("С русского на английский")) {
                    getSupportLoaderManager().initLoader(0, null, MainActivity.this);
                } else if (str.equals("С английского на русский")) {

                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
    }

    protected void onDestroy() {
        super.onDestroy();
        // закрываем подключение при выходе
        db.close();
    }

    @Override
    public Loader onCreateLoader(int id, Bundle args) {
        return new MyCursorLoader(this, db);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        cursorAdapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }

    static class MyCursorLoader extends CursorLoader {
        DBHeler db;
        public MyCursorLoader(Context context, DBHeler db) {
            super(context);
            this.db = db;
        }

        @Override
        public Cursor loadInBackground() {
            Cursor cursor = db.getRuWords();
            return cursor;
        }

    }
}

我需要当从微调器中选择值“从俄语到英语”时,来自 db.getRuWords() 光标的数据显示在列表视图中,如果选择值“从英语到俄语”,则数据来自显示 db.getEnWords() 光标。代码应该是什么样子,我什么都不懂?

确实如此。但它不起作用

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    private AutoCompleteTextView txtSearch;
    private Spinner spinner;
    private ListView list;
    private ImageButton btnClear;

    private final int RULOADER = 1;
    private final int ENLOADER = 1;

    DBHeler db;

    private MyCursorAdapter cursorAdapter;

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

        db = new DBHeler(this);

        try {
            db.createDataBase();
            db.openDataBase();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        spinner = (Spinner) findViewById(R.id.spinner);
        // Настраиваем адаптер
        ArrayAdapter<?> adapter =
                ArrayAdapter.createFromResource(this, R.array.types, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Вызываем адаптер
        spinner.setAdapter(adapter);

        txtSearch = (AutoCompleteTextView) findViewById(R.id.txtSearch);
        list = (ListView) findViewById(R.id.list);
        btnClear = (ImageButton) findViewById(R.id.btnClear);

        /*Выводим в список все слова, при запуске программы*/
        String selectedItem = spinner.getSelectedItem().toString();
        if (selectedItem.equals("С русского на английский")) {
            cursorAdapter = new MyCursorAdapter(this, R.layout.item, null, 0);
            list.setAdapter(cursorAdapter);
        } else if (selectedItem.equals("С английского на русский")) {
            cursorAdapter = new MyCursorAdapter(this, R.layout.item, null, 0);
            list.setAdapter(cursorAdapter);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        txtSearch.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if (b && txtSearch.getText().toString().length() > 0)
                    btnClear.setVisibility(View.VISIBLE);
                else
                    btnClear.setVisibility(View.INVISIBLE);
            }
        });

        txtSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                if(charSequence.length() != 0){
                    btnClear.setVisibility(View.VISIBLE);
                }else{
                    btnClear.setVisibility(View.INVISIBLE);
                }


            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(MainActivity.this, SlovoActivity.class);
                CharSequence strCharSequence = ((TextView)view.findViewById(R.id.txtSlovo)).getText();
                String str = strCharSequence.toString().toLowerCase().trim();
                String selectedItem = spinner.getSelectedItem().toString();
                if (selectedItem.equals("С русского на английский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "RU");
                    startActivity(intent);
                } else if (selectedItem.equals("С английского на русский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "EN");
                    startActivity(intent);
                }
            }
        });

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                txtSearch.setText("");
                String str = adapterView.getItemAtPosition(i).toString();
                if (str.equals("С русского на английский")) {
                    getSupportLoaderManager().initLoader(RULOADER, null, MainActivity.this);
                    list.setAdapter(cursorAdapter);
                } else if (str.equals("С английского на русский")) {
                    getSupportLoaderManager().initLoader(ENLOADER, null, MainActivity.this);
                    list.setAdapter(cursorAdapter);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
    }

    protected void onDestroy() {
        super.onDestroy();
        // закрываем подключение при выходе
        db.close();
    }

    @Override
    public Loader onCreateLoader(int id, Bundle args) {
        if (id == RULOADER) {
            return new RuWords(MainActivity.this, db);
        } else {
            return new EnWords(MainActivity.this, db);
        }
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        //cursorAdapter.swapCursor(data);
        if(loader instanceof RuWords) {
            cursorAdapter.swapCursor(data);
        } else {
            cursorAdapter.swapCursor(data);
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {

    }

    static class RuWords extends CursorLoader {
        DBHeler db;
        public RuWords(Context context, DBHeler db) {
            super(context);
            this.db = db;
        }

        @Override
        public Cursor loadInBackground() {
            Cursor cursor = db.getRuWords();
            return cursor;
        }
    }

    static class EnWords extends CursorLoader {
        DBHeler db;
        public EnWords(Context context, DBHeler db) {
            super(context);
            this.db = db;
        }

        @Override
        public Cursor loadInBackground() {
            Cursor cursor = db.getEnWords();
            return cursor;
        }
    }
}

怎么了?

android
  • 1 个回答
  • 10 Views
Martin Hope
Вероника
Asked: 2020-01-07 19:03:26 +0000 UTC

通过 SimpleCursorAdapter 添加到 ListView

  • 0

我正在制作一个从俄语到英语的字典程序,反之亦然。

有一个表格Spinner可以选择翻译方向。有一个txtSearch用于搜索单词的文本字段,并且ListView根据翻译方向显示数据库表中的单词。ListView我通过基于SimpleCursorAdapter.

这是适配器代码:

public class MyCursorAdapter extends SimpleCursorAdapter {
    private int layout;
    DBHeler db;
    Context ctx;

    MyCursorAdapter(Context ctx, int layout, Cursor cursor, String[] from, int[] to, DBHeler db) {
        super(ctx, layout, cursor, from, to);
        this.layout = layout;
        this.db = db;
        this.ctx = ctx;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(layout, parent, false);
        return view;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        String bukva = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO)).substring(0, 1).toUpperCase();
        final String slovo = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO));
        final String izbrannoe = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_IZBRANNOE));

        TextView txtBukva = (TextView) view.findViewById(R.id.txtBukva);
        TextView txtSlovo = (TextView) view.findViewById(R.id.txtSlovo);
        final ImageButton btnIzbrannoe = (ImageButton) view.findViewById(R.id.btnIzbrannoe);

        txtBukva.setText(bukva);
        txtSlovo.setText(slovo);
        btnIzbrannoe.setFocusable(false);

        if (izbrannoe.equals("1")) {
            btnIzbrannoe.setImageResource(R.drawable.icon_star_yellow);
        } else if (izbrannoe.equals("0")) {
            btnIzbrannoe.setImageResource(R.drawable.icon_star_outline_black);
        }

        btnIzbrannoe.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (izbrannoe.equals("1")) {
                    ContentValues values = new ContentValues();
                    values.put(Contract.Entry.COLUMN_IZBRANNOE, "0");
                    long newRowId = db.database.update(Contract.Entry.TABLE_RUEN, values, Contract.Entry.COLUMN_SLOVO + "= ?", new String[]{slovo});
                    if (newRowId == -1) {
                        Toast.makeText(ctx, "Ошибка", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(ctx, "Удалено из избранное", Toast.LENGTH_SHORT).show();
                        btnIzbrannoe.setImageResource(R.drawable.icon_star_outline_black);
                    }
                } else if (izbrannoe.equals("0")) {
                    ContentValues values = new ContentValues();
                    values.put(Contract.Entry.COLUMN_IZBRANNOE, "1");
                    long newRowId = db.database.update(Contract.Entry.TABLE_RUEN, values, Contract.Entry.COLUMN_SLOVO + "= ?", new String[]{slovo});
                    if (newRowId == -1) {
                        Toast.makeText(ctx, "Ошибка", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(ctx, "Добавлено в избранное", Toast.LENGTH_SHORT).show();
                        btnIzbrannoe.setImageResource(R.drawable.icon_star_yellow);
                    }
                }
            }
        });
    }
}

这是 MainActivity 的主要代码:

public class MainActivity extends AppCompatActivity {

    private AutoCompleteTextView txtSearch;
    private Spinner spinner;
    private ListView list;
    private ImageButton btnClear;

    DBHeler db;

    private MyCursorAdapter myCursorAdapter;
    private Cursor cursor;
    String[] from;
    int[] to;

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

        db = new DBHeler(this);

        try {
            db.createDataBase();
            db.openDataBase();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        spinner = (Spinner) findViewById(R.id.spinner);
        // Настраиваем адаптер
        ArrayAdapter<?> adapter =
                ArrayAdapter.createFromResource(this, R.array.types, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Вызываем адаптер
        spinner.setAdapter(adapter);

        txtSearch = (AutoCompleteTextView) findViewById(R.id.txtSearch);
        list = (ListView) findViewById(R.id.list);
        btnClear = (ImageButton) findViewById(R.id.btnClear);

        /*Выводим в список все слова, при запуске программы*/
        String selectedItem = spinner.getSelectedItem().toString();

        if (selectedItem.equals("С русского на английский")) {
            cursor = db.getRuWords();
            from = new String[] {Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_IZBRANNOE};
            to = new int[] {R.id.txtBukva, R.id.txtSlovo, R.id.btnIzbrannoe};
            myCursorAdapter = new MyCursorAdapter(this, R.layout.item, cursor, from, to, db);
            list.setAdapter(myCursorAdapter);
        } else if (selectedItem.equals("С английского на русский")) {
            cursor = db.getEnWords();
            from = new String[] {Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_SLOVO, Contract.Entry.COLUMN_IZBRANNOE};
            to = new int[] {R.id.txtBukva, R.id.txtSlovo, R.id.btnIzbrannoe};
            myCursorAdapter = new MyCursorAdapter(this, R.layout.item, cursor, from, to, db);
            list.setAdapter(myCursorAdapter);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        txtSearch.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if (b && txtSearch.getText().toString().length() > 0)
                    btnClear.setVisibility(View.VISIBLE);
                else
                    btnClear.setVisibility(View.INVISIBLE);
            }
        });

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(MainActivity.this, SlovoActivity.class);
                CharSequence strCharSequence = ((TextView)view.findViewById(R.id.txtSlovo)).getText();
                String str = strCharSequence.toString().toLowerCase().trim();
                String selectedItem = spinner.getSelectedItem().toString();
                if (selectedItem.equals("С русского на английский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "RU");
                    startActivity(intent);
                } else if (selectedItem.equals("С английского на русский")) {
                    intent.putExtra("slovo", str);
                    intent.putExtra("type", "EN");
                    startActivity(intent);
                }
            }
        });

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                txtSearch.setText("");
                String str = adapterView.getItemAtPosition(i).toString();
                if (str.equals("С русского на английский")) {
                    cursor = db.getRuWords();
                    myCursorAdapter = new MyCursorAdapter(MainActivity.this, R.layout.item, cursor, from, to, db);
                    list.setAdapter(myCursorAdapter);
                } else if (str.equals("С английского на русский")) {
                    cursor = db.getEnWords();
                    myCursorAdapter = new MyCursorAdapter(MainActivity.this, R.layout.item, cursor, from, to, db);
                    list.setAdapter(myCursorAdapter);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
    }
}

下面是连接数据库、查询游标数据等类代码:

public class Contract {
    private Contract() {
    };

    public static final class Entry implements BaseColumns {
        public final static String TABLE_RUEN = "ruen";
        public final static String TABLE_ENRU = "enru";

        public final static String _ID = BaseColumns._ID;
        public final static String COLUMN_SLOVO = "slovo";
        public final static String COLUMN_PEREVOD = "perevod";
        public final static String COLUMN_IZBRANNOE = "izbrannoe";
    }
}

数据库助手类:

public class DBHeler extends SQLiteOpenHelper {
    //Пусть к БД
    private static String DB_PATH = "/data/data/tests.mytest/databases/";
    //Имя файла базы данных
    private static final String DATABASE_NAME = "dbase.db";
    //Версия базы данных. При изменении схемы увеличить на единицу
    private static final int DATABASE_VERSION = 1;
    //Объектная переменная типа SQLiteDatabase
    public SQLiteDatabase database;
    private Context myContext;

    final String ruQuery = "SELECT * " + " FROM " + Contract.Entry.TABLE_RUEN;
    //запрос, позволяет вывести все слова из колонки word
    final String enQuery = "SELECT * " + " FROM " + Contract.Entry.TABLE_ENRU;

    //Конструктор
    //Третий параметр null в суперклассе используется для работы с курсорами. Сейчас их не используем, поэтому оставим в покое.
    public DBHeler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.myContext = context;
    }

    public Cursor getRuWords() {
        return database.rawQuery(ruQuery, null); //в курсор выбираем все слова из запроса
    }

    public Cursor getEnWords() {
        return database.rawQuery(enQuery, null); //в курсор выбираем все слова из запроса
    }

    public void createDataBase() throws IOException {
        boolean dbExist = checkDataBase();

        if(dbExist){
            //ничего не делать - база уже есть
        }else{
            //вызывая этот метод создаем пустую базу, позже она будет перезаписана
            this.getReadableDatabase();

            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

    private boolean checkDataBase(){
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DATABASE_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        } catch(SQLiteException e){
            //база еще не существует
        }
        if(checkDB != null){
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    private void copyDataBase() throws IOException{
        //Открываем локальную БД как входящий поток
        InputStream myInput = myContext.getAssets().open(DATABASE_NAME);

        //Путь ко вновь созданной БД
        String outFileName = DB_PATH + DATABASE_NAME;

        //Открываем пустую базу данных как исходящий поток
        OutputStream myOutput = new FileOutputStream(outFileName);

        //перемещаем байты из входящего файла в исходящий
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        //закрываем потоки
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    public void openDataBase() throws SQLException {
        //открываем БД
        String myPath = DB_PATH + DATABASE_NAME;
        //database = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        database = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    }

    @Override
    public synchronized void close() {
        if(database != null)
            database.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

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

    }
}

问题:

使用btnIzbrannoe.setOnClickListener(new View.OnClickListener()添加到收藏夹的方法,它起作用了,但是当我第二次点击btnIzbrannoe从收藏夹中移除时,它不起作用。那些。不会从收藏夹中删除。按钮的图标发生变化,实际上并没有从收藏夹中删除。

java
  • 2 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5