java - RecyclerView 搜索过滤器过滤结果后位置错误

标签 java android android-recyclerview searchview

你好, friend ,请帮助我,我正在使用 Recylerview 并实现了 searchfilter,但问题是,在 recylerview 中搜索项目后,当我单击项目时,它总是返回项目的 0 位置,我想要列表项目的实际位置,请帮助我这里是我的代码如何在recyclerview中搜索项目后获取实际位置recylerview

这是我的代码

package bible.swordof.God;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, SearchView.OnQueryTextListener {
    private ListView listView;
    private ArrayList<String> books;
    private ArrayList<String> bookid;
    private ListViewAdapter adapter;
    private DatabaseHelper mDBHelper = null;
    private SQLiteDatabase mDb = null;
    BookRecyclerAdopter bookRecyclerAdopter;

//life is awesome

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        setData();
        RecyclerView bookanme = findViewById(R.id.list);
        bookanme.setLayoutManager(new LinearLayoutManager(this));

    bookRecyclerAdopter = new BookRecyclerAdopter(this, books);

        bookanme.setAdapter(bookRecyclerAdopter);



        /*    adapter = new ListViewAdapter(MainActivity.this, R.layout.item_listview, books, bookid);
        listView.setAdapter(adapter);*/







        /* listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                 int booknumber=position;
                 String  bookname=bookid.get(position);





                Toast.makeText(MainActivity.this, ""+bookname, Toast.LENGTH_SHORT).show();

             *//*   Intent intent=new Intent(MainActivity.this,Chapters.class);
                intent.putExtra("booknumber",booknumber);

                intent.putExtra("bookname",bookname);

                startActivity(intent);*//*



            }
        });
    }

*/
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.search_voice_btn:
                Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
                if (intent.resolveActivity(getPackageManager()) != null) {
                    startActivityForResult(intent, 10);
                } else {
                    Toast.makeText(this, "Your Device Don't Support Speech Input", Toast.LENGTH_SHORT).show();
                }


                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case 10:
                if (resultCode == RESULT_OK && data != null) {

                    ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);


                    Toast.makeText(this, "" + result.get(0), Toast.LENGTH_SHORT).show();


                }
                break;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);

        MenuItem myActionMenuItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(myActionMenuItem);

        searchView.setOnQueryTextListener(this);

        return true;
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        Fragment fragment;
        int id = item.getItemId();


        if (id == R.id.home) {

            Intent intent = new Intent(this, MainActivity.class);
            startActivity(intent);

        } else if (id == R.id.favoruite) {
            Intent intent = new Intent(this, Favourite.class);

            startActivity(intent);
        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    private void setData() {


        books = new ArrayList<>();
        bookid = new ArrayList<>();

        mDBHelper = new DatabaseHelper(this);
        mDb = mDBHelper.getReadableDatabase();

        Cursor cursor = mDb.rawQuery("select b,n from key_english", new String[]{});


        if (cursor != null && cursor.getCount() > 0) {
            if (cursor.moveToFirst()) {
                do {
                    books.add(cursor.getString(1));
                    bookid.add(cursor.getString(0));

                } while (cursor.moveToNext());
            }
        }
    }


    @Override
    public boolean onQueryTextSubmit(String s) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newtext) {

        String userinput = newtext.toLowerCase();
        List<String> newlist = new ArrayList<>();
        for (String name : books) {

            if (name.toLowerCase().contains(userinput)) {

                newlist.add(name);


            }


        }

        bookRecyclerAdopter.updatelist(newlist);
        return true;

    }

}




package bible.swordof.God;

import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;

import java.util.ArrayList;
import java.util.List;

public class BookRecyclerAdopter extends RecyclerView.Adapter<BookRecyclerAdopter.Booksholder>{

    private List<String> bookname;

Context context;

    public BookRecyclerAdopter(Context context,List<String> bookname) {
        this.bookname = bookname;
        this.context=context;

    }



    public class Booksholder extends RecyclerView.ViewHolder {
        private ImageView imageView;
        private TextView bookname;

        public Booksholder(@NonNull View itemView) {
            super(itemView);
            imageView = (ImageView) itemView.findViewById(R.id.image_view);
            bookname = (TextView) itemView.findViewById(R.id.text);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {



                }
            });
        }
    }


    @Override
    public Booksholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View view = inflater.inflate(R.layout.item_listview, viewGroup, false);


        return new Booksholder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Booksholder booksholder, final int i) {
        booksholder.bookname.setText(bookname.get(i));

        //get first letter of each String item
        String firstLetter = String.valueOf(bookname.get(i).charAt(0));




        ColorGenerator generator = ColorGenerator.MATERIAL; // or use DEFAULT
        // generate random color
        int color = generator.getColor(bookname.get(i));

        TextDrawable drawable = TextDrawable.builder()
                .buildRound(firstLetter, color); // radius in px



        booksholder.imageView.setImageDrawable(drawable);




    }



    @Override
    public int getItemCount() {
        return bookname.size();
    }

public  void  updatelist(List<String>newlist){
        bookname=new ArrayList<>();
        bookname.addAll(newlist);
        notifyDataSetChanged();
}

}

最佳答案

您将需要维护一个单独的书名列表。我们称之为filteredBookname。最初将其设置为bookname

public class BookRecyclerAdopter extends RecyclerView.Adapter<BookRecyclerAdopter.Booksholder>{

    private List<String> bookname;
    private List<String> filteredBookname;

Context context;

    public BookRecyclerAdopter(Context context,List<String> bookname) {
        this.bookname = bookname;
        this.filteredBookname = bookname
        this.context=context;

    }
...
// other pieces of code.

不要使用 bookname 来填充 RecyclerView 项,而是使用 filteredBookname

您的更新列表方法将是,

public  void  updatelist(List<String>newlist){
        filteredBookname=new ArrayList<>();
        filteredBookname.addAll(newlist);
        notifyDataSetChanged();
}

使用上述方法,您总能在原始列表bookname中找到您的项目的正确位置

关于java - RecyclerView 搜索过滤器过滤结果后位置错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56382814/

相关文章:

java - 从 .properties 文件为 JUnit 初始化一个常量,该文件本身是从 pom.xml 文件初始化的

java - 当我第一次启动应用程序时,用户名是空的

android - LayoutManager 之前的 ItemDecoration?

android - 在 updateAppWidget 中更新的小部件不显示任何列表数据

java - 在 Recyclerview 中,如何将初始滚动位置更改为第一项的顶部?

android - 可以将 fragment 放入 RecyclerView 或 ListView 中吗?

java - spring @Value 注解,继承和公共(public)字段但不同的值

java - 节俭的 Kerberos?

java - 自类型 - 需要类型绑定(bind)内的类型

android - 如何使模态弹出窗口在 webview 中获得焦点?