Как сослаться на исходную позицию элемента списка при включенном текстовом фильтре? - PullRequest
2 голосов
/ 05 марта 2012

Когда я использую текст редактирования, чтобы отфильтровать элементы, позиции списка все перепутались, и элементы больше не вызывают правильное намерение.Любая помощь приветствуется

lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String mName = filteredValues.get(position).getName().toString();
        String mWeb = filteredValues.get(position).getWebsite().toString();

        Intent openDetails = new Intent(Test.this, ResourceDetails.class);
        Bundle b = new Bundle();            
        b.putString("name", mName);
        b.putString("web", mWeb);
        openDetails.putExtras(b);
        startActivity(openDetails);                 
    }
});

private TextWatcher filterTextWatcher = new TextWatcher(){
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before, int count) {
        adapter.getFilter().filter(s);
        adapter.notifyDataSetChanged();
    }

    public void afterTextChanged(Editable s) {
    }
};

Ответы [ 4 ]

2 голосов
/ 22 октября 2013
 flashsearchList.setOnItemClickListener(new OnItemClickListener() {

        @Override 
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Integer temp=flashSearchNameMap.get(adapter.getItem(position));

            navigateSearch(temp); 



        }
    }); 

(adapter.getItem (position) вернет вам точное имя списка, и во flashSearchNameMap я сохранил имена и позицию в начале от создания до применения фильтрации. Так что вы можете получить точную позицию с помощью этого

1 голос
/ 16 марта 2015

, если вы используете ViewHolder в Adapter, просто определите переменную realPosition в классе держателей и установите ее в YourAdapter.getView

и в списке нажмите Слушатель

 ContactAdapter.ViewHolder holder = (YourAdapter.ViewHolder) view.getTag();
 holder.realPosition
1 голос
/ 05 марта 2012

Предполагается, что вы используете пользовательский объект bean для хранения значений вашего имени и веб-сайта и ArrayAdapter для отображения их в вашем ListView, например,

public class NamedLink {
    final String mName;
    final String mWebsite; 
    public NamedLink(String name, String website) {
        mName = name;
        mWebsite = website;
    }
    @Override
    public String toString() {
        return mName;
    }
}

С помощью адаптера определено что-то вроде этого:

mAdapter = new ArrayAdapter<NamedLink>(this, android.R.layout.simple_list_item_2, mLinks) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = LayoutInflater.from(WhateverYourActivityIsNamed.this).inflate(android.R.layout.simple_list_item_2, null);
            }
            NamedLink link = getItem(position);
            // This probably deserves a ViewHolder
            ((TextView) convertView.findViewById(android.R.id.text1)).setText(link.getName());
            ((TextView) convertView.findViewById(android.R.id.text2)).setText(link.getWebsite());
            return convertView;
        }
    };

Когда вы фильтруете адаптер массива, он сопоставляется с bean-компонентами #toString(), которые в этом случае возвращают имя. После фильтрации адаптер массива внутренне поддерживает правильно проиндексированную копию списка бинов, т. Е. Вы можете использовать позицию, которую вы получите в прослушивателе кликов, например:

getListView().setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // getItemAtPosition() will return a NamedLink from the filtered
            // list maintained inside the ArrayAdapter
            NamedLink link = (NamedLink) parent.getItemAtPosition(position);
            Intent openDetails = new Intent(Test.this, ResourceDetails.class);
            Bundle b = new Bundle();            
            b.putString("name", link.getName());
            b.putString("web", link.getWebsite());
            openDetails.putExtras(b);
            startActivity(openDetails);  
        }
    });
1 голос
/ 05 марта 2012

Позиция элемента не является надежной при использовании списков.Я рекомендую вам использовать view.setTag(Object) для присвоения идентификатора каждому элементу при присоединении контента.Это может быть число, строка или что-то еще.Тогда вы можете просто получить к нему доступ с помощью view.getTag() внутри прослушивателя щелчков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...