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;

}