【问题标题】:the result of pressing button is displayed after two presses按两次后显示按键结果
【发布时间】:2019-04-06 18:48:58
【问题描述】:

我有一个在firebase中搜索的活动,它包含用于在我按下按钮时键入文本和按钮的edittext结果应该出现在recyclerview中但是当我第一次按下按钮时,除非我按下按钮,否则什么都不会出现第二次 findDataActivity的代码

public class FindDataActivity extends AppCompatActivity {
    DatabaseReference db;
    FirebaseHelper helper;
    MyAdapter adapter;
    RecyclerView rv;
    EditText findETxt;
    Button findBtn;
    ArrayList<Paints> p;
    String s;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        ActionBar actionBar = getSupportActionBar();
        if(actionBar != null)
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        //SETUP RECYCLER
        rv = (RecyclerView) findViewById(R.id.rvsearch);
        rv.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

        //INITIALIZE FIREBASE DB
        db = FirebaseDatabase.getInstance().getReference("Database");

        adapter = new MyAdapter(FindDataActivity.this, p);
        rv.setAdapter(adapter);
        findBtn = (Button) findViewById(R.id.find_btn);
        helper = new FirebaseHelper(db);
    }

    public void search(View view) {

        db.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                findETxt = (EditText) findViewById(R.id.findETxt);
                s = findETxt.getText().toString();
                p=helper.retrieveSearch(s);
                adapter = new MyAdapter(FindDataActivity.this, p);
                rv.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }




    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id=item.getItemId();
        if(id == android.R.id.home){
            onBackPressed();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

firebase 的代码

public class FirebaseHelper {
    DatabaseReference db;
    Boolean saved=null;
    Boolean saved1=null;

    ArrayList<Paints> paints=new ArrayList<>();
    ArrayList<String> keys=new ArrayList<>();

    public FirebaseHelper(DatabaseReference db) {
        this.db = db;
    }
     //READ THEN RETURN ARRAYLIST FOR SEARCH ITEMS IN CASE OF SEARCHING ABOUT ITEM
    public ArrayList<Paints> retrieveSearch(final String item) {
        db.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                fetchDataSearch(dataSnapshot,item);
            }
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                fetchDataSearch(dataSnapshot,item);
            }
            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
            }
            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
        return paints;
    }

    //IMPLEMENT FETCH DATA AND FILL ARRAYLIST FOR SEARCH
    private void fetchDataSearch( DataSnapshot dataSnapshot,String item)
    {
        paints.clear();

        //sorting and searching
        final DatabaseReference myRef = db.child("items");
        Query query = myRef.orderByChild("type").startAt(item)
                .endAt(item + "\uf8ff");

        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot messageSnapshot : dataSnapshot.getChildren()) {
                    Paints paint=messageSnapshot.getValue(Paints.class);

                    paints.add(paint);
                    //Toast.makeText(FindDataActivity.this, "found " + type + " unit: " + unit + " price " + price, Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

【问题讨论】:

  • 总是按两次后?还是在快速按下 3 次或更多次后会发生这种情况?
  • 它总是在两次按下后
  • 但是你的findBtn按钮点击监听器在哪里
  • 另外,在 RecyclerView 上设置适配器后,您不需要调用“notifyDataSetChanged”。它是多余的,而且可能非常昂贵。其次,您的 onClick 功能“搜索”实际上并不执行搜索。它只是附加了一个侦听器,如果您对 Firebase DB 执行查询,该侦听器就会被触发。
  • 我把它放在布局android:onClick="search"

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

在您的MyAdapter 类中,您必须创建这样的方法:

public void updateAdapter(ArrayList<Paints> paint){
    this.paint= paint;
    notifyDataSetChanged();
}

在您的 search method 中,将 adapter.notifyDataSetChanged(); 替换为 adapter.updateAdapter(p);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2012-11-06
    相关资源
    最近更新 更多