gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:01:29 25 4
gpt4 key购买 nike

你好, 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com