2013-02-11 55 views
0

我在我的项目中有一个ListView。它有很多元素,并且它使用自定义适配器,因为它从轨道服务器动态填充。ListView OnLongClick奇怪的行为

我想在项目长压时更改ListItem的内容。为了实现这个目标,我在ListItem中有两个布局,一个可见,一个隐藏。

问题是,当我长按项目时,布局会发生变化(如预期的那样),但其他ListItems也会受到影响,并以相同的方式进行更改。这似乎每5个项目发生一次,我不知道为什么。

这是我使用的LongClickListener,它位于德GetView方法中的自定义适配器上:

View v = convertView; 

if (v == null){ 
    LayoutInflater vi = 
     (LayoutInflater)getActivity().getSystemService(
     Context.LAYOUT_INFLATER_SERVICE); 
    v = vi.inflate(R.layout.list_item, null); 
} 

final LinearLayout placeInfo = 
    (LinearLayout) v.findViewById(R.id.list_item_info); 

final RelativeLayout placeBrief = 
    (RelativeLayout)v.findViewById(R.id.list_item_brief); 

v.setOnLongClickListener(new OnLongClickListener(){ 

    @Override public boolean onLongClick(View v) { 
     placeInfo.setVisibility(View.GONE); 
     placeBrief.setVisibility(View.VISIBLE); 
     return false; 
    }}); 

我希望得到任何帮助,非常感谢提前。

+1

你打算长时间点击整个列表视图还是单个项目,如果是这样,你应该使用'setOnItemLongClick()'来代替。 – draksia 2013-02-11 21:00:03

+0

我试过了,但是我无法让它工作。不过,我这样做的方式改变了布局。它的副作用(布局更改影响多于1个ListItem),我无法解决。 – Sebiwi 2013-02-11 21:03:44

+0

所以我想你试图做的是当你的列表视图中的一个项目被长时间点击,你不想再显示该列表中的项目? 如果是这种情况,我可以尽快写点东西。 – draksia 2013-02-11 22:19:39

回答

0

ListViews recycle Views,所以你只有几个视图的所有项目。您直接更改这些视图实例之一以在信息|摘要之间切换。您需要的是将受影响位置的信息简介标志的状态保存在其他地方(例如,在适配器中应该是“摘要”的位置列表)。这样,当你回到getView()时,你可以显示正确的。

+0

我理解这个概念。然而,我应该如何根据列表在getView()内部显示de右边的一个?我无法想象它。 – Sebiwi 2013-02-11 21:31:25

+1

最简单的(也不是最有效的方法)就是只有一个布尔值数组,它的大小与列表的大小相同,其值应该显示为简短的“真实”值。但是你并不需要那么多,只是一个包含你想要的索引的集合('brief = set.contains(position)')。 – dmon 2013-02-11 22:02:25

+0

完美,非常感谢! – Sebiwi 2013-02-12 13:32:06