我有一个ListView
,其中每个项目都包含一张非常大的图片和一些文字。它基本上就像其他熟悉的应用程序中的提要。
在我的ListView
中,我有4
个项目。但是,同时只能看到2
个OnClickListener
个。我在每个项目上设置getView()
,翻转项目并显示一些新信息。
当我点击第一个项目时,它会被翻转,但是当我向下滚动时,第四个项目也会被翻转。换句话说,项目#1和#4对相同的行为做出反应。
如果我缩小每个项目以使整个ListView在屏幕上可见,则只翻转所单击的项目。这是我想要的行为。我怀疑这与允许适配器方法的 public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row_list_view, null);
}
final Item item = items.get(position);
if (item != null) {
TextView listPos = (TextView) v.findViewById(R.id.listPosText);
TextView caption = (TextView) v.findViewById(R.id.contactInfoText);
if(ad.getPosition()!=null)
listPos.setText(item.getPosition());
if(ad.getCaption()!=null)
caption.setText(item.getCaption());
final ViewFlipper cardFlipper = v.findViewById(R.id.flipper);
RelativeLayout front = (RelativeLayout) v.findViewById(R.id.listImageFront);
front.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AnimationFactory.flipTransition(cardFlipper, FlipDirection.RIGHT_LEFT);
}
});
RelativeLayout back = (RelativeLayout) v.findViewById(R.id.listImageBack);
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AnimationFactory.flipTransition(cardFlipper, FlipDirection.RIGHT_LEFT);
}
});
com.list.components.AspectRatioImageView imgView = (com.list.components.AspectRatioImageView) v.findViewById(R.id.listMainImage);
String imageid = "";
try {
imageid = item.getImages().getString(0);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
imageLoader.DisplayImage("myURL"+imageid, imgView, back);
}
return v;
}
通过convertView参数重用关联视图这一事实有关。但我无法弄清楚如何解决这个问题。
任何想法如何实现我想要的行为?
编辑:getView() - 方法
{{1}}
答案 0 :(得分:1)
在getView
中,您将获得convertView
作为参数。 convertView
是将被重用的视图。有了这些知识,检查视图是否被翻转应该相当容易,如果是,则将其翻转。
当您缩小项目时,它将不得不制作额外的视图,因为它只会重复使用屏幕上看不到的视图。但是,您会注意到,如果添加更多项目,则会出现与小项目相同的翻转“问题”。
答案 1 :(得分:1)
我假设你在getView()方法中设置了监听器?对于可扩展列表视图,我在子项中切换按钮时遇到了类似的问题。我通过将视图(在我的情况下是按钮)存储在稀疏数组中来解决这个问题,并且只有当该键的值为null时才设置一次侦听器。
private SparseArray<ToggleButton> buttons1;
private SparseArray<ToggleButton> buttons2;
...
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View view, ViewGroup parent)
{
...
if(buttons1.get(groupPosition, null) == null)
{
//add favoriteButton to array at group position
buttons2.put(groupPosition, b2);
buttons1.put(groupPosition, b1);
b2.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View v)
{
//...
}
});
b1.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View v)
{
//...
}
});
}
//add buttons to array at group position
buttons2.put(groupPosition, b2);
buttons1.put(groupPosition, b1);
return view;
}
b1和b2是代码中前面的id找到的切换按钮。
答案 2 :(得分:1)
您需要为每个列表项添加boolean
标志(因此在提供ArrayAdapter的Object类中)以警告哪些列表项被翻转。这正是因为意见被回收。
// in your `Object` class that supplies the `ArrayAdapter`
boolean isFlipped = false;
// in the ArrayAdapter
Object.setOnClickListener(new OnClickListener() {
Object.setIsFlipped(true);
});
// in getView() method
if (arrayOfObjects.get(position).getIsFlipped()) {
// show flipped info
}
else {
// unshow flipped info
}