为什么会筛选失败呢?

为什么会筛选失败呢?

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

    public static final String TAG="123";
    public static final int REQUEST_CODE=1444;
    private LoaderManager loaderManager;
    private ListView listView;
    private EditText edt;
    private String name;
    private SimpleCursorAdapter mCursorAdapter;

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

        listView=findViewById(R.id.id_lv);
        edt=findViewById(R.id.id_edt);
        
        //设置游标适配器
        mCursorAdapter = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                null,
                new String[]{ContactsContract.Contacts.DISPLAY_NAME},
                new int[]{android.R.id.text1},
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        listView.setAdapter(mCursorAdapter);

        edt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                name=s.toString();
                //重新创建loader
                loaderManager.restartLoader(0,null,MainActivity.this);
                Log.i(TAG, "onTextChanged: 1");
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        loaderManager = getSupportLoaderManager();
        loaderManager.initLoader(0,null,this);



    }

    //请求权限
    private void request() {
        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_CONTACTS) !=
                PackageManager.PERMISSION_GRANTED) {//没有权限需要动态获取
            //动态请求权限
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE);
        }

        if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_CONTACTS) !=
                PackageManager.PERMISSION_GRANTED) {//没有权限需要动态获取
            //动态请求权限
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE);
        }
    }


    @NonNull
    @Override
    public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
        Uri uri=ContactsContract.Contacts.CONTENT_URI;

        if(!TextUtils.isEmpty(name)){
            Log.i(TAG, "onCreateLoader: 2  "+name);
            uri=Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI,
                    Uri.encode(name));
        }

        Log.i(TAG, "onCreateLoader: 3"+uri.toString());
        CursorLoader cursorLoader=new CursorLoader(this,
                ContactsContract.Contacts.CONTENT_URI,
                null,
                null,
                null,
                null);

        return cursorLoader;
    }

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

    @Override
    public void onLoaderReset(@NonNull Loader<Cursor> loader) {
        //释放当前cursor
        mCursorAdapter.swapCursor(null);
    }
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
irista23 2018-05-28 16:22:56

如果你是采用老师课堂上案例的方式,下图第三个红框中应该传入的是uri

http://img1.sycdn.imooc.com//climg/5b0bbc340001638f06090283.jpg

  • 视频中是这样传参的。用bundle是第二种方法。
    2018-06-06 16:09:40
irista23 2018-05-28 10:55:24

你获取的name没有用到筛选上,应该把筛选条件封装到一个Bundle对象中,initLoader()时也传入Bundle。

http://img1.sycdn.imooc.com//climg/5b0b6e9d00014d0006430290.jpg

  • 提问者 CV工程师鱼 #1
    可是老师视频了也是这样写的啊。。。为啥他就可以
    2018-05-28 16:05:23
  • 提问者 CV工程师鱼 #2
    加了Bundle也没用,而且我的Name是全局变量,在onCreateLoader里面也是能用到的啊
    2018-05-28 16:12:09
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Android数据通信开发与应用2018版
  • 参与学习           人
  • 提交作业       147    份
  • 解答问题       687    个

本专题介绍了Android开发核心组件:广播、服务及全局应用。教会你如何使用AIDL、Thread、Socket、蓝牙解决进程线程间通信问题。利用Glide等实现异步加载及NDK原生代码开发。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师