RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 612261
Accepted
Вероника
Вероника
Asked:2020-01-09 00:33:24 +0000 UTC2020-01-09 00:33:24 +0000 UTC 2020-01-09 00:33:24 +0000 UTC

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

  • 772

我正在尝试以 这个答案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 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    pavlofff
    2020-01-09T12:31:14Z2020-01-09T12:31:14Z

    由于您有不同种类的数据(数字和字符串),因此使用模型对象传递数据更有意义。此外,特别是在您的情况下,由于已完成的数据库的限制,它将 selected 的状态存储为字符串,我们将进行有用的转换 - 将此状态表示为boolean. 状态true-在收藏夹中,false-不在收藏夹中,这将大大简化处理逻辑。

    让我们创建一个模型类(其中有活动类等):

    public class Data {
        long id;
        String word;
        String simbol;
        boolean favorite;
    
        public Data(long id, String word, String simbol, String favorite) {
            this.id = id;
            this.word = word;
            this.simbol = simbol;
            this.favorite = (favorite.equals("1"))? true:false;
        }
    }
    

    现在在适配器中我们填写这个模型并通过标签发送它(只有演示所需的适配器代码):

    public class MyCursorAdapter extends CursorAdapter {
    
        public static class ViewHolder {
            public TextView txtBukva;
            public TextView txtSlovo;
            public ImageButton btnIzbrannoe;
    
            public ViewHolder(View view) {
              txtBukva = (TextView) view.findViewById(R.id.txtBukva);
              txtSlovo = (TextView) view.findViewById(R.id.txtSlovo);
              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, final Cursor cursor) {
    
            ViewHolder holder = (ViewHolder) view.getTag();
    
            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));
            long _ID = cursor.getLong(cursor.getColumnIndex(Contract.Entry._ID));
    
            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 {
                holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_outline_black);
            }
    
            // через конструктор устанавливаем значения для передачи в Activity
            holder.btnIzbrannoe.setTag(new Data(_ID,slovo,bukva,izbrannoe);
    
        }
    
    }
    

    我们进入活动:

    public void onFavoriteClick(View view) {
    
          Data data = (Data)view.getTag();
          long id = data.id;
          String slovo = data.word;
          String bukva = data.simbol;
          boolean izbrannoe = data.favorite;
    }
    

    如果计划在答题器外部使用数据,那么我们将局部变量移至类字段。

    PS:我还纠正了 pattern 的使用ViewHolder。该模式的目的是缓存指向项目对象的链接(每次绑定到项目时都会获得这些链接,持有人在这种形式下是无用的)。事实上,通过该方法从标记中获取到小部件的链接是findViewById()在创建每个项目时执行它的资源密集型操作,因此在创建标记时会接收一次这些链接,然后将其存储在容器中。以上方法newView(),bindView()没有代码削减。

    PPS:建议从数据库中获取 ID 值long(而不是int),因为这个数字可能非常大,我建议修复它(在示例中更正)。

    • 1

相关问题

Sidebar

Stats

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

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +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
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +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