【问题标题】:Custom listView getting wrong position after Filter过滤后自定义listView位置错误
【发布时间】:2017-08-25 10:49:31
【问题描述】:

我是 Android 上的新手,当我使用 baseadapter 过滤列表视图时,我得到了真实的结果,但是在单击此项目后,我无法获得该项目的相关值。 喜欢原始列表:A - B -C -D 过滤后的列表:B - C - D 当我在过滤列表中单击“B”时,程序流 A 的值。我不知道如何处理,我尝试了很多解决方案,但我做不到。我需要帮助。

我的适配器类

public class MyListAdapter extends BaseAdapter implements Filterable {

MediaPlayer mPlayer=new MediaPlayer() ;
private String[] gelenLink;
private int[] IMAGE_ID = {R.drawable.police};
private List<String>originalData = null;
private List<String>filteredData = null;
private LayoutInflater mInflater;
private ItemFilter mFilter = new ItemFilter();

public MyListAdapter(Context context, List<String> data, String[] linkler) {
    this.filteredData = data ;
    this.originalData = data ;
    this.gelenLink= linkler;

    mInflater = LayoutInflater.from(context);
}

public int getCount() {
    return filteredData.size();
}

public Object getItem(int position) {
    return filteredData.get(position);
}

public long getItemId(int position) {
    return position;
}


public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder holder;

    convertView=null;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.radio_listview, null);
        holder= new ViewHolder();
        holder.img = (ImageView) convertView.findViewById(R.id.list_item_thumbnail);
        holder.img.setImageResource(IMAGE_ID[0]);
        holder.title = (TextView) convertView.findViewById(R.id.list_item_text);
        holder.button = (Button) convertView.findViewById(R.id.list_item_btn);
        holder.stop_button = (Button) convertView.findViewById(R.id.list_item_stop_btn);


        convertView.setTag(holder);
    } else {

        holder = (ViewHolder) convertView.getTag();
    }

    holder.title.setText(filteredData.get(position));

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

            try {

                radioLinks(gelenLink[position]);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void radioLinks(String city) throws IOException {

            if(mPlayer.isPlaying()) {
                mPlayer.stop();
                mPlayer.reset();
            }
            mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mPlayer.setDataSource(city);
            mPlayer.prepareAsync();
            mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mPlayer.start();
                }
            });

        }

    });

    holder.stop_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mPlayer.stop();
            mPlayer.reset();
        }
    });

    return convertView;
}


public Filter getFilter() {
    return mFilter;
}

private class ItemFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        String filterString = constraint.toString().toLowerCase();

        FilterResults results = new FilterResults();

        final List<String> list = originalData;

        int count = list.size();
        final ArrayList<String> nlist = new ArrayList<String>(count);

        String filterableString ;

        for (int i = 0; i < count; i++) {
            filterableString = list.get(i);
            if (filterableString.toLowerCase().contains(filterString)) {
                nlist.add(filterableString);
            }
        }

        results.values = nlist;
        results.count = nlist.size();

        return results;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        filteredData = (ArrayList<String>) results.values;
        notifyDataSetChanged();
    }

}}

我的 viewHolder 类:

public class ViewHolder {
ImageView img;
TextView title;
Button button;
Button stop_button;}

MainActivity 部分:

            ArrayList<String> radioname = new ArrayList<String>();
            ArrayList<String> tmp = new ArrayList<String>();
            private String[] radiolinks;            
            MyListAdapter adapter;
            EditText editText;

/////////////////
//onPostExecute
////////////////
     editText = (EditText) findViewById(R.id.search_tv);
                adapter = new MyListAdapter(getApplicationContext(), tmp, radiolinks);
                listView1.setAdapter(adapter);
                listView1.setTextFilterEnabled(true);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {


            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                adapter.getFilter().filter(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

【问题讨论】:

    标签: android listview android-custom-view listadapter android-filterable


    【解决方案1】:

    改变这个:

    public MyListAdapter(Context context, List<String> data, String[] linkler) {
        this.filteredData = data ;
        this.originalData = data ;
        this.gelenLink= linkler;
    
        mInflater = LayoutInflater.from(context);
    }
    

    到这里:

    public MyListAdapter(Context context, List<String> data, String[] linkler) {
        super(context, 0, data);
        this.filteredData = data ;
        this.originalData = data ;
        this.gelenLink= linkler;
    
        mInflater = LayoutInflater.from(context);
    }
    

    此外,一旦您将数据传递给适配器,getView 是您需要实现的唯一功能:

    public View getView(int position, View convertView, ViewGroup parent);
    

    这是ArrayAdapter的完整示例:

    public class MyAdapterWithHolder extends ArrayAdapter<FileInfo> {
    
        ArrayList<FileInfo> dataSet;
        LayoutInflater inflater;
        ListView listView;
    
        public MyAdapterWithHolder(Context context, ArrayList<FileInfo> objects, ListView listView) {
            super(context, 0, objects);
    
            dataSet = objects;
            inflater = LayoutInflater.from(context);
            this.listView = listView;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            Holder rowHolder = null;
            if( convertView == null ){//create new row
                convertView = inflater.inflate( R.layout.row, null );
                rowHolder = new Holder();
                rowHolder.image  = (ImageView) convertView.findViewById( R.id.imageView1 );
                rowHolder.name   = (TextView) convertView.findViewById( R.id.folderName1 );
                rowHolder.count  = (TextView) convertView.findViewById( R.id.itemCount1 );
                rowHolder.date   = (TextView) convertView.findViewById( R.id.date1 );
                convertView.setTag(rowHolder);
            }else{
                rowHolder = (Holder) convertView.getTag();
            }
    
            final FileInfo p = getItem( position );
            rowHolder.name.setText(p.fileName);
            rowHolder.date.setText(p.creationDate);
            rowHolder.image.setImageResource(p.icon);
            if( p.isDirectory() )
                rowHolder.count.setText( p.size == -1 ? "" : ( "" + p.size + " items" ) );
            else
                rowHolder.count.setText( p.fileSize );
    
            return convertView;
        }
    
        static  class Holder{
            ImageView image;
            TextView name;
            TextView count;
            TextView date;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2013-04-16
      • 1970-01-01
      • 2021-04-27
      相关资源
      最近更新 更多