在可搜索的ListView中处理onItemClick事件

时间:2013-12-16 21:45:38

标签: java android listview

我想知道如何解决我目前遇到的问题。让我来解释一下: 我用一些字符串创建了一个ListView。当我点击ListView中的某个项目时,我使用了onItemClick事件来处理我的点击。当我点击鸡尾酒时,它会打开鸡尾酒页面,当我点击甜点时,它会打开甜点页面。为此我使用了数组中字符串的位置。 (所以位置0 =鸡尾酒,位置1 =甜点,等等......)

但是当我使用搜索功能时会出现问题。因为当我搜索'd'时,列表中的第一项将是甜点,当我点击它时会打开鸡尾酒,因为我编写了第0个位置以打开鸡尾酒页面。

有没有办法让我能够不在列表中使用位置,而是将点击引用到字符串。 类似于:if ... ==“cocktail”{Intent i = new Intent(Main.java,Cocktails.java)} ... 这样我就能够将数组中的每个字符串硬编码到某个页面。

这可能吗?如果是的话,你能帮我吗?谢谢!

我目前的代码是:

public class Aperitiefhapjes extends Activity {

    private ListView lv; // List view
    ArrayAdapter<String> adapter; // Listview Adapter
    EditText inputSearch; // Search EditText
    ArrayList<HashMap<String, String>> productList; // ArrayList for Listview

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_aperitiefhapjes);

        // Listview Data
        String products[] = {"cocktails","desserts"};

        lv = (ListView) findViewById(R.id.lv_aperitiefhapjes);
        inputSearch = (EditText) findViewById(R.id.inputSearch);

        // Adding items to listview
        adapter = new ArrayAdapter<String>(this, R.layout.searchlist_item, R.id.searchlist_naam, products);
        lv.setAdapter(adapter); 

        // Enabling Search Filter
        inputSearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                // When user changed the Text
                Aperitiefhapjes.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
            }
        });

        registerClickCallback();
    }

    public void registerClickCallback()
    {
        ListView list=(ListView)findViewById(R.id.lv_aperitiefhapjes);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {
                //0 = cocktails
                if(position == 0)
                {
                    Intent i = new Intent(Aperitiefhapjes.this, Cocktails.class);
                    startActivity(i);
                }      
                //1 = desserts
                if(position == 1)
                {
                    Intent i = new Intent(Aperitiefhapjes.this, Desserts.class);
                    startActivity(i);
                }  
            }
        });
    }
}

我猜这个问题必须在registerClickCallback方法中修复。

2 个答案:

答案 0 :(得分:0)

我过去曾使用自定义数组适配器做类似的事情。

public class CustomAdapter extends ArrayAdapter<String> {
}

可以使用“查看持有者”类标记视图。我不会发布很多代码,只是给你一些基本的想法。有资源和示例可供您查看更多相关详细信息。

您将声明一个内部ViewHolder类来封装与listview项相关联的其他数据。

static class ViewHolder {
    protected TextView itemNumber;
    protected ImageView imageView;
    protected TextView text;
    protected CheckBox checkbox;
}

'标记'这样的视图

view.setTag(viewHolder);

获取标签数据就像这样

ViewHolder holder = (ViewHolder) view.getTag();

答案 1 :(得分:0)

这里......

public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id)
 {
     String data=(String)parent.getItemAtPosition(position);
     // compare data and set your intents accordingly.


 }});