我有一个ListView,其中包含具有此布局的项目:
<LinearLayout ...>
<LinearLayout ...>
<!--Elements -->
</LinearLayout>
<LinearLayout ...>
<!--Elements -->
</LinearLayout>
</LinearLayout>
所以我的项目有两个不同的部分。我希望能够在每个项目中设置不同的onclickListener(每个LinearLayout一个)。到目前为止,我已经尝试覆盖onListItemClick,但它似乎无法正常工作:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
ViewGroup vg = (ViewGroup)v;
vg.getChildAt(0).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mCtx, "element1", Toast.LENGTH_SHORT).show();
}
});
vg.getChildAt(1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mCtx, "element2", Toast.LENGTH_SHORT).show();
}
});
}
任何想法如何解决这个问题?
感谢。
答案 0 :(得分:11)
您必须将set onclicklistener
用于ListView中的所有元素。
我创建了一个列表视图。将适配器设置为listview。我的适配器是负责显示listview的每个元素。所以在getView()
里面,我会将onclicklistener分配给我想要获得点击事件的所有元素。
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder holder;
if(convertView==null){
vi = inflater.inflate(R.layout.item, null);
holder=new ViewHolder();
holder.text=(TextView)vi.findViewById(R.id.text);;
holder.image=(ImageView)vi.findViewById(R.id.image);
vi.setTag(holder);
}
else
holder=(ViewHolder)vi.getTag();
holder.text.setText("item "+position);
holder.image.setTag(data.get(position));
holder.image.setOnClickListener(this);
holder.text.setOnClickListener(this);
imageLoader.DisplayImage(data.get(position), activity, holder.image);
return vi;
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
System.out.println("...clicked view is...."+arg0);
}
由于 迪帕克
答案 1 :(得分:1)
您不需要每个列表项的OnClickListener,但您需要找到每个列表视图,例如在你的活动OnCreate
listView1 = (ListView) this.findViewById(R.id.ListView1);
listView2 = (ListView) this.findViewById(R.id.ListView2);
然后你的onListItemClick变成 -
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
if (l.equals(listView1))
{
switch (position)
{
case 0:
Toast.makeText(mCtx, "list1-element1", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(mCtx, "list1-element2", Toast.LENGTH_SHORT).show();
break;
}
}
else
{
switch (position)
{
case 0:
Toast.makeText(mCtx, "list2-element1", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(mCtx, "list2-element2", Toast.LENGTH_SHORT).show();
break;
}
}
}
除非我误解了你想要做的事情。
答案 2 :(得分:0)
我可能在这里遗漏了一些东西,但不是设置的简洁版本:
aListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
然后实施:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d(LOG_TAG, "List view click: " + getListView().getCheckedItemCount());
Toast.makeText(this,
String.valueOf(getListView().getCheckedItemCount()),
Toast.LENGTH_LONG).show();
return true;
}
自API级别1以来,上述解决方案已经可用