Android 在自定义listview中搜索筛选器后保留原始列表位置将使用数组适配器filterable
我有一个可过滤的自定义列表视图。它当前获取筛选器。但在过滤后,原始位置会丢失,因此,当我设置Android 在自定义listview中搜索筛选器后保留原始列表位置将使用数组适配器filterable,android,Android,我有一个可过滤的自定义列表视图。它当前获取筛选器。但在过滤后,原始位置会丢失,因此,当我设置onClickListener时,它显示的结果是错误的。有没有办法得到原来的位置 搜索适配器 public class SearchAdapter extends ArrayAdapter implements Filterable{ private List<word> allModelItemsArray; private List<word> filteredModelIt
onClickListener
时,它显示的结果是错误的。有没有办法得到原来的位置
搜索适配器
public class SearchAdapter extends ArrayAdapter implements Filterable{
private List<word> allModelItemsArray;
private List<word> filteredModelItemsArray;
private Activity context;
private ModelFilter filter;
private LayoutInflater inflator;
MediaPlayer mediaPlayer;
private List<word> list;
public SearchAdapter(Activity context, List<word> list) {
super(context, R.layout.search_row, list);
this.context = context;
this.allModelItemsArray = new ArrayList<word>();
this.list = list;
allModelItemsArray.addAll(list);
this.filteredModelItemsArray = new ArrayList<word>();
filteredModelItemsArray.addAll(allModelItemsArray);
inflator = context.getLayoutInflater();
getFilter();
}
@Override
public Filter getFilter() {
if (filter == null){
filter = new ModelFilter();
}
return filter;
}
static class ViewHolder {
protected TextView text;
protected TextView translatedText;
protected TextView pronounce;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/NotoSans-Regular.ttf");
word m = filteredModelItemsArray.get(position);
ViewHolder viewHolder = null;
if (convertView == null) {
view = inflator.inflate(R.layout.search_row, null);
viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.list_view_search_words);
viewHolder.text.setTypeface(font);
viewHolder.translatedText = (TextView) view.findViewById(R.id.translated_text);
viewHolder.translatedText.setTypeface(font);
viewHolder.pronounce = (TextView) view.findViewById(R.id.pronounce);
viewHolder.pronounce.setTypeface(font);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = ((ViewHolder) view.getTag());
}
viewHolder.text.setText(m.getMainText());
viewHolder.translatedText.setText(m.getTranslationText());
viewHolder.pronounce.setText(m.getPronunciation_in_english());
/*get full sound file name*/
Integer fileNameLength = m.getAudio().toString().length();
String fileName = m.getAudio().toString();
final String soundFile = fileName.substring(0,fileNameLength - 4);
final ImageView imgPlay = (ImageView) view.findViewById(R.id.phraselist_play_audio);
imgPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer == null) {
View parentRow = (View) v.getParent();
ListView listView = (ListView) parentRow.getParent();
final int position = listView.getPositionForView(parentRow);
try {
Uri mp3 = Uri.parse("android.resource://" + context.getPackageName() + "/raw/" + soundFile);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(context, mp3);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
imgPlay.setImageResource(R.drawable.playactive);
// mediaPlayer.setOnCompletionListener(onCompletionListener);
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer.release();
mediaPlayer = null;
imgPlay.setImageResource(R.drawable.playinactive);
}
});
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
return view;
}
private class ModelFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults result = new FilterResults();
if(constraint != null && constraint.toString().length() > 0)
{
ArrayList<word> filteredItems = new ArrayList<word>();
for(int i = 0, l = allModelItemsArray.size(); i < l; i++)
{
word m = allModelItemsArray.get(i);
if(m.getMainText().toLowerCase().contains(constraint))
filteredItems.add(m);
}
result.count = filteredItems.size();
result.values = filteredItems;
}
else
{
synchronized(this)
{
result.values = allModelItemsArray;
result.count = allModelItemsArray.size();
}
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredModelItemsArray = (ArrayList<word>)results.values;
notifyDataSetChanged();
clear();
for(int i = 0, l = filteredModelItemsArray.size(); i < l; i++)
add(filteredModelItemsArray.get(i));
notifyDataSetInvalidated();
}
}
}
公共类SearchAdapter扩展ArrayAdapter实现可过滤{
私有列表allModelItemsArray;
私有列表筛选器模型阵列;
私人活动语境;
私有模型过滤器;
私人充气机;
媒体播放器;
私人名单;
公共SearchAdapter(活动上下文、列表){
super(上下文、R.layout.search_行、列表);
this.context=上下文;
this.allModelItemsArray=newArrayList();
this.list=列表;
allModelItemsArray.addAll(列表);
this.FilteredModeLiteMarray=新ArrayList();
filteredModelItemsArray.addAll(allModelItemsArray);
充气器=context.getLayoutFlater();
getFilter();
}
@凌驾
公共过滤器getFilter(){
if(filter==null){
过滤器=新的ModelFilter();
}
回流过滤器;
}
静态类视窗夹{
受保护的文本查看文本;
受保护的文本视图translatedText;
受保护的TextView发音;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=空;
Typeface font=Typeface.createFromAsset(context.getAssets(),“font/notsans Regular.ttf”);
单词m=filteredModelItemsArray.get(位置);
ViewHolder ViewHolder=null;
if(convertView==null){
视图=充气机。充气(R.layout.search_行,空);
viewHolder=新的viewHolder();
viewHolder.text=(TextView)view.findViewById(R.id.list\u view\u search\u words);
viewHolder.text.setTypeface(字体);
viewHolder.translatedText=(TextView)view.findViewById(R.id.translated_text);
viewHolder.translatedText.setTypeface(字体);
viewHolder.devonce=(TextView)view.findViewById(R.id.devonce);
viewHolder.发音.setTypeface(字体);
view.setTag(viewHolder);
}否则{
视图=转换视图;
viewHolder=((viewHolder)view.getTag());
}
viewHolder.text.setText(m.getMainText());
viewHolder.translatedText.setText(m.getTranslationText());
viewHolder.发音.setText(m.getpersonation_in_english());
/*获取完整的声音文件名*/
整数fileNameLength=m.getAudio().toString().length();
字符串文件名=m.getAudio().toString();
最终字符串soundFile=fileName.substring(0,fileNameLength-4);
final ImageView imgPlay=(ImageView)view.findViewById(R.id.phraselist\u play\u audio);
imgPlay.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(mediaPlayer==null){
View parentRow=(View)v.getParent();
ListView ListView=(ListView)parentRow.getParent();
最终int位置=listView.getPositionForView(父行);
试一试{
urimp3=Uri.parse(“android.resource://“+context.getPackageName()+”/raw/“+soundFile”);
mediaPlayer=新的mediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(上下文,mp3);
mediaPlayer.prepare();//可能需要很长时间!(用于缓冲等)
mediaPlayer.start();
imgPlay.setImageResource(R.drawable.playactive);
//setOnCompletionListener(onCompletionListener);
mediaPlayer.setOnCompletionListener(新的mediaPlayer.OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
mediaPlayer.release();
mediaPlayer=null;
imgPlay.setImageResource(R.drawable.playinactive);
}
});
}捕获(IllegalArgumentException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(安全异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(非法状态){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
});
返回视图;
}
私有类ModelFilter扩展了筛选器
{
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
constraint=constraint.toString().toLowerCase();
FilterResults结果=新的FilterResults();
if(constraint!=null&&constraint.toString().length()>0)
{
ArrayList filteredItems=新的ArrayList();
对于(int i=0,l=allModelItemsArray.size();iprotected void onResume(){
super.onResume();
GlobalState state = ((GlobalState) getApplicationContext());
state.doAction();
wordDb = new wordDB(SearchListActivity.this);
paymentDb = new paymentDB(SearchListActivity.this);
//getAllWords();
final ArrayList<word> words = new ArrayList<word>();
Cursor row;
Integer checkPayment = paymentDb.CheckTable();
/*If free not purchased*/
if(checkPayment == 0)
{
row = wordDb.selectWordList("0");
}
else
{
row = wordDb.selectAllWord();
}
row.moveToFirst();
while (!row.isAfterLast()) {
words.add( new word(row.getString(0),row.getString(1),row.getString(2),row.getString(3),row.getString(4),row.getString(5),row.getString(6),row.getString(7),row.getString(8),row.getString(9)));
row.moveToNext();
}
row.close();
final SearchAdapter adapter = new SearchAdapter(SearchListActivity.this, words);
final ListView listView = (ListView) findViewById(R.id.search_list_view_word);
listView.setAdapter(adapter);
final EditText etSearch = (EditText) findViewById(R.id.etSearch);
// Add Text Change Listener to EditText
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Call back the Adapter with current character to Filter
adapter.getFilter().filter(s.toString());
adapter.notifyDataSetChanged();
listView.setAdapter(adapter);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) {
}
@Override
public void afterTextChanged(Editable s) {
if(s.length()==0){
}
}
});
ListView searchListView;
searchListView = (ListView)findViewById(R.id.search_list_view_word);
searchListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object o = parent.getItemAtPosition(position);
word_obj = (word) o;
if (Integer.valueOf(word_obj.getCategoryId()) >= 0) {
Intent myIntent = new Intent(SearchListActivity.this, WordDetailsActivity.class);
myIntent.putExtra("word_obj", word_obj);
myIntent.putExtra("position", position);
//Log.d("id",String.valueOf(id));
//Log.d("getitem", String.valueOf(adapter.getItemId(position)));
//words.get(words.indexOf(searchAdapter.getItemId(position)));
myIntent.putExtra("currentClickedId", word_obj.getCsvWordId().toString());
myIntent.putExtra("favouriteFlag", 0);
myIntent.putExtra("searchFlag", 1);
myIntent.putExtra("searchString", etSearch.getText().toString());
SearchListActivity.this.startActivity(myIntent);
}
}
});
}
song_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
SongModel songModel = (SongModel)arrayAdapter.getItem(position);
/* Toast.makeText(getActivity().getApplicationContext(),songModel.getSongTitle(),Toast.LENGTH_SHORT).show();*/
String path = songModel.path();
for(int i=0;i<songs.size();i++){
if(songs.get(i).path().equals(path)){
pos=i;
}
}
Intent intent
= new Intent(getActivity(), PlayMedia.class);
intent.putExtra("position", pos);
intent.putExtra("songlist", songs);
intent.putExtra("clicked", "yes");
startActivity(intent);
}
});
return view;
}