如何为每个ListView项创建onClick方法

时间:2012-08-27 12:08:33

标签: android

我有一个listView,它有大约100个项目。

目前我有这段代码:

public class VanillaList extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.vanilla_block_list);

        ArrayList<ItemDetails> image_details = GetSearchResults();

        final ListView lv1 = (ListView) findViewById(R.id.listV_main);
        lv1.setAdapter(new ItemListBaseAdapter(this, image_details));

        lv1.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
                Object o = lv1.getItemAtPosition(position);
                ItemDetails obj_itemDetails = (ItemDetails)o;
                Toast.makeText(VanillaList.this, "You have clicked on : " + " " + obj_itemDetails.getName(), Toast.LENGTH_LONG).show();
            }  
        });
    }

这会显示一个Toast通知,说明前面有“你点击过:”的列表项的名称。

所有100件商品都是如此。我如何为每个项目创建不同的onClick方法。我试过了:

public class VanillaBlockList extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.vanilla_block_list);

        ArrayList<ItemDetails> image_details = GetSearchResults();

        final ListView lv1 = (ListView) findViewById(R.id.listV_main);
        lv1.setAdapter(new ItemListBaseAdapter(this, image_details));

        lv1.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
                Object o = lv1.getItemAtPosition(position);
                ItemDetails obj_itemDetails = (ItemDetails)o;
                Toast.makeText(VanillaBlockList.this, "You have chosen : " + " " + obj_itemDetails.getName(), Toast.LENGTH_LONG).show();
            }  
lv2.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
                Object o = lv2.getItemAtPosition(position);
                ItemDetails obj_itemDetails = (ItemDetails)o;
                Toast.makeText(VanillaBlockList.this, "You have chosen : " + " " + obj_itemDetails.getName(), Toast.LENGTH_LONG).show();
            } 
        });
    }

但这对我没用。谁能帮我? 我更喜欢onClick方法,就像在布局XML文件中有android:onClick="something"

然后在java文件中:

public void something{
//method here
}

感谢。

3 个答案:

答案 0 :(得分:2)

使用开关或

 if(obj_itemDetails.getName().equals("choice 1"){
  /* Do somes Struff*/ }

答案 1 :(得分:1)

我希望在Custom Adapter类中,您使用项目布局来显示列表中的每个项目。在该项目列表中,我认为您正在使用TextView来显示项目描述。要获得每个项目的点击,需要修改适配器代码,如下所示:

在自定义适配器中创建一个接口:

public interface OnItemClickListener{
    void onClick(View v,String description);
}

在自定义适配器中创建一个字段:

private OnItemClickListener listener;

从适配器构造函数中,初始化Listener:

public ItemListBaseAdapter(....,OnItemClickListener listener){
    ...your code.
    this.listener=listener;
}

在适配器的getView(...)中更改/添加以下代码

TextView tv=convertView.findViewById(yourID);
tv.setOnClickListener(new TextView.OnClickListener() {

        @Override
        public void onClick(View v) {
            if(listener!=null){
                listener.onClick(v, ((TextView)v).getText().toString());
            }
        }
    });

然后在你的活动课中,

创建一个新字段:

private OnItemClickListener myItemClickListener=new OnItemClickListener() {

    @Override
    public void onClick(View v, String description) {
        // Do what you like when individual item gets clicked.

    }
};

将适配器实例创建为:

new ItemListBaseAdapter(this, image_details, myItemClickListener);

现在,当您点击listitem中的textview时,您的myItemClickListener的onClick将被调用,您可以根据需要进行处理。

如果你需要整个listitem的click事件而不是TextView,那么在Adapter的getView(..)方法中设置convertView的onClick而不是TextView

答案 2 :(得分:0)

listView是整个listView,您不能将每个项目视为不同的实体。

您可以使用Viewposition作为参数进行功能,可以使用它们来切换案例来区分它们