【问题标题】:How to refer to the original position of a list item when text filter is enabled?启用文本过滤器时如何引用列表项的原始位置?
【发布时间】:2012-03-05 16:08:47
【问题描述】:

当我使用编辑文本过滤项目时,列表位置变得一团糟,项目不再调用正确的意图。任何帮助表示赞赏

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) {
    }
};

【问题讨论】:

  • 为什么不把你需要的ID放到Tag行里,直接用Integer id = (Integer)view.getTag();
  • 我没试过..我现在试试..谢谢
  • 您是否在使用带有自定义 #getView 的 ArrayAdapter?

标签: android listview filter


【解决方案1】:
 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 中,我已在应用过滤之前从 oncreate 开始存储名称和位置。因此您可以通过此获得确切位置

【讨论】:

    【解决方案2】:

    如果您在Adapter 中使用ViewHolder,只需在 holder 类中定义一个 realPosition 变量并将其设置在 YourAdapter.getView 中

    并在listClick监听器中

     ContactAdapter.ViewHolder holder = (YourAdapter.ViewHolder) view.getTag();
     holder.realPosition
    

    【讨论】:

      【解决方案3】:

      使用列表时项目位置不可靠。我建议您在附加内容时使用view.setTag(Object) 为每个项目分配一个标识符。这可以是一个数字、字符串或任何东西。然后你可以在点击监听器中使用view.getTag() 访问它。

      【讨论】:

        【解决方案4】:

        假设您使用自定义 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() 匹配,在这种情况下返回名称。过滤后,数组适配器会在内部维护您的 bean 列表的正确索引副本 - 即您可以使用在点击侦听器中获得的位置,如下所示:

        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);  
                }
            });
        

        【讨论】:

        • 我很惊讶他没有接受它作为答案,奇迹男孩:) 继续努力。!我没有足够的积分,但当我得到时,我肯定会尽我所能来赏金这个答案。!
        猜你喜欢
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-16
        • 2021-05-05
        • 2017-01-28
        相关资源
        最近更新 更多