RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 612029
Accepted
Вероника
Вероника
Asked:2020-01-08 03:40:54 +0000 UTC2020-01-08 03:40:54 +0000 UTC 2020-01-08 03:40:54 +0000 UTC

通过 CursorLoader 的两个游标

  • 772

如何通过 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 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    pavlofff
    2020-01-08T11:47:53Z2020-01-08T11:47:53Z

    大约这样的代码,只剩下对示例重要的活动部分(不幸的是,我没有什么可以测试的,因此可能存在小缺陷)。方法和参数中的 ID 指示当前使用的加载器。

    public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
    
        private Spinner spinner;
        private ListView list;
        static final  int LOADER_RUS = 0;
        static final int LOADER_ENG = 1;
    
        DBHeler db;
    
        private MyCursorAdapter cursorAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            db = new DBHeler(this);
    
            spinner = (Spinner) findViewById(R.id.spinner);
            list = (ListView) findViewById(R.id.list);
    
            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};
            cursorAdapter = new MyCursorAdapter(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) {
                }
            });
    
    
        }
    
        protected void onDestroy() {
            super.onDestroy();
            db.close();
        }
    
        @Override
        public Loader 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);
        }
    
        static class MyCursorLoader extends CursorLoader {
            Cursor cursor;
            DBHeler db;
            final int LoaderID;
            public MyCursorLoader(Context context, DBHeler db, int id) {
                super(context);
                this.db = db;
                LoaderID = id;
            }
    
            @Override
            public Cursor loadInBackground() {
              switch (LoaderID) {
                    case LOADER_RUS: cursor = db.getRuWords();
                           break;
                    case LOADER_ENG: cursor = db.getEnWords();
                           break;
              }
            return cursor;
            }
    
        }
    }
    

    MyCursorLoader将要连接的游标作为第三个参数 ID。

    При выборе пункта в спинере обновление загрузчика происходит по нажатой позиции (а не по содержимому пункта списка) - третий аргумент колбэка с именем loadID в данном коде передает позицию выбранного пункта. Позиция может быть 0 или 1, ID наших загрузчиков так же 0 или 1 для русского и английского набора соответственно.

    • 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