通过编辑文本可搜索的列表视图

Posted

技术标签:

【中文标题】通过编辑文本可搜索的列表视图【英文标题】:Searchable list view through Edit text 【发布时间】:2014-02-26 19:35:15 【问题描述】:

大家好,我想开发一个应用程序,它在数组列表中有很多项目和一个编辑文本以便在列表视图中快速使用搜索项目我向你展示这样的图像:

那么如何在页面中实现

【问题讨论】:

你有没有尝试实现它。请发布您的代码?? 我有一个列表视图和一个编辑文本列表视图从数组列表中获取值,并且数组中有很多项目,我想让我在编辑文本中键入 Gu,我得到所有值 starer Gu像古吉拉特邦 只需查看整个示例 [此处][1]。 [1]:***.com/questions/21501356/… developer.android.com/guide/topics/ui/controls/text.html .. 只需转到此链接,它可能会为您提供一些解决方案。 【参考方案1】:

尝试 Android 中提供的自动完成文本视图。它在 android 中使用搜索功能编辑文本。

您不需要编写代码来使用自动完成文本视图进行过滤

有关源代码,请查看this 示例。

如果有任何疑问,您可以询问。祝您编码愉快:)

【讨论】:

【参考方案2】:

您需要将 addTextChangedListener 添加到您的 EditText。当用户在 EditText 输入新数据时,从中获取文本并将其传递给数组适配器过滤器。 你可以这样添加:

inputSearch.addTextChangedListener(new TextWatcher() 

@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) 
    // When user changed the Text
    MainActivity.this.adapter.getFilter().filter(cs);  


@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
        int arg3) 
    // TODO Auto-generated method stub



@Override
public void afterTextChanged(Editable arg0) 
    // TODO Auto-generated method stub                         

);

完整的例子是here

【讨论】:

【参考方案3】:

您是否检查过 Arrayadapter 的过滤方法,您需要设置 textwatcher 并且在 textchange 方法中您需要调用 adapter.filter("word enter in edittext") 并且您完成了更多详细检查 this

【讨论】:

我在使用适配器和 addtextxhanger 时遇到了一些问题,但是当我得到这个过滤器的结果时,我得到的不是数据库 id 的数组值 你能告诉我你到底想做什么吗?你想在 listview 项目单击还是在 textchange 上显示 id? 我有一个列表视图和一个编辑文本和列表视图从数据库中获取值并在列表视图中设置,并且数据库有三列 id、名称、站点名称,所以我想使用列表视图访问那些网站在可搜索的编辑文本的帮助下的项目就是它 那么当您选择任何项目时,只需查询(选择查询)该值即可获得与该值等效的站点并打开相同的值。 我把我的代码检查了一下,我认为它与数组列表有关【参考方案4】:

AutoCompleteTextView 可能会实现您想要做的事情,因此您必须通过它更改您的 EditText

此外,您需要扩展自己的ArrayAdapter,并在其中扩展您的Filter 类并声明扩展过滤器类的实例。在Filter 扩展中,您需要覆盖以下方法:

FilterResults performFiltering(CharSequence):你实现了如何你想要过滤。 void publishResults(CharSequence, final FilterResults):您将在此处收到从 FilterResults 返回的结果作为第二个参数。如果您有不止一件物品,只需致电notifyDataSetChanged()

这样您就可以按照自己的方式进行过滤。 here 可以找到一个很好的例子。

【讨论】:

【参考方案5】:

试试这个简单的代码: XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context=".SOF_AutoList" >

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical" >

        <EditText
            android:id="@+id/editText1"
            android:layout_
            android:layout_
            android:hint="Name" >

            <requestFocus />
        </EditText>
    </LinearLayout>

    <ListView
        android:id="@+id/listView1"
        android:layout_
        android:layout_ >
    </ListView>

</LinearLayout>

Java 活动类:

public class SOF_AutoList extends Activity

    private ListView listview;
    private EditText edttxt;
    private ArrayAdapter<String> adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sof__auto_list);

        ArrayList<String> data = new ArrayList<String>();
        for(int i=0;i<10;i++)
        
            if(i==0 || i==1 || i==3)
            
                data.add("Apple "+(i+1));
            
            else if(i==4 || i==5)
            
                data.add("Banana "+(i+1));
            
            else
            
                data.add("CArrot "+(i+1));
            
        

        listview = (ListView)findViewById(R.id.listView1);
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1,data);
        listview.setAdapter(adapter);

        edttxt = (EditText)findViewById(R.id.editText1);
        edttxt.addTextChangedListener(new TextWatcher()
        

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) 
                // TODO Auto-generated method stub
                adapter.getFilter().filter(s);
            

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) 
                // TODO Auto-generated method stub

            

            @Override
            public void afterTextChanged(Editable s) 
                // TODO Auto-generated method stub

            
        );
    



【讨论】:

【参考方案6】:

我使用此代码通过简单的编辑文本制作了一个自动完成的编辑文本。

公共类 MainActivity 扩展 Activity 实现 OnKeyListener

EditText e;
String[] st="apple","abhay","anurag","boll","banana","basic","cat","calm";
String[] temp="","","","","","";
ArrayAdapter<String> ad;
ListView lv;
ViewGroup vg;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    vg=(ViewGroup)findViewById(R.id.LinearLayout1);
    e=(EditText)findViewById(R.id.editText1);
    e.setOnKeyListener(this);
    ad=new ArrayAdapter<String>(getBaseContext(),android.R.layout.simple_list_item_1, temp);
    lv=new ListView(getBaseContext());
    lv.setAdapter(ad);
    lv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

@Override
public boolean onKey(View arg0, int arg1, KeyEvent arg2) 
    // TODO Auto-generated method stub
    Log.d("", "onKey Entered");
    if(KeyEvent.ACTION_UP==arg2.getAction())
    

    vg.removeView(lv);
    String s=e.getText().toString();
    Log.d("", "onKey if Entered"+s);
    for(int i=0,j=0;i<st.length;i++,j++)
    
        if(st[i].startsWith(s))
            temp[j]=st[i];
        else
            --j;

    
    vg.addView(lv);


    return false;

【讨论】:

【参考方案7】:

我的代码在这里

ArrayList<Integer> ids=new ArrayList<Integer>();
    ArrayList<String>  ar=new ArrayList<String>();

    ArrayAdapter  adpter;

    private ListView list;
    private EditText search;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        search=(EditText)findViewById(R.id.tvsearch);

        ActionBar ab=getActionBar();

        list =(ListView)findViewById(R.id.list);

        handler h=new handler(MainActivity.this);
        ArrayList<property> p = h.display();
        StringBuffer sb;

        for(property p1 : p)
        
            sb=new StringBuffer();
            int id=p1.getId();
            String State_Name = p1.getState_name();
            String State_Web= p1.getState_web();

            ar.add(State_Name);
            ids.add(id);

        
            h.close();


            adpter=new ArrayAdapter(MainActivity.this, android.R.layout.simple_selectable_list_item,ar);
            list.setAdapter(adpter);

            search.addTextChangedListener(new TextWatcher() 

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) 
                    MainActivity.this.adpter.getFilter().filter(s); 

                

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) 
                    // TODO Auto-generated method stub

                

                @Override
                public void afterTextChanged(Editable s) 
                    // TODO Auto-generated method stub

                
            );

    //  list.setAdapter(new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_selectable_list_item,ar));
        list.setOnItemClickListener(new OnItemClickListener() 

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int pos,
                    long id) 
            
                int did=ids.get(pos);
                Intent i=new Intent(MainActivity.this,website.class);
                i.putExtra("did",did);
                startActivity(i);
            
        );

    

【讨论】:

在这种情况下你会得到错误的 id 你需要像这样查询 int did = ids.get(ar.indexOf(selected item(state name))) 你会得到正确的答案

以上是关于通过编辑文本可搜索的列表视图的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试在选项卡活动中实现可搜索的列表视图

文本文件字符串拆分然后将每个元素输出到视图表中

从编辑文本中过滤列表视图

重新加载可扩展列表时如何重新关注编辑文本...?

如何在页面背面保存部分视图html

如何在相对布局中添加固定标题和滚动视图表行?