多个ListView项目对相同的行为做出反应

时间:2014-03-04 19:46:02

标签: android listview android-listview android-arrayadapter

我有一个ListView,其中每个项目都包含一张非常大的图片和一些文字。它基本上就像其他熟悉的应用程序中的提要。

在我的ListView中,我有4个项目。但是,同时只能看到2OnClickListener个。我在每个项目上设置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}}

3 个答案:

答案 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
}