如何在使用BaseAdapter生成的listview中仅在一行中进行更改?

时间:2014-05-15 01:34:29

标签: android listview baseadapter getview

我使用ListView生成了BaseAdapter。我的Listview中有2个Button。我想在点击行中的Button2时使我的Button1不可见。然后,当单击另一行的Button2时,我想使当前行中的Button1不可见,并且先前不可见的Button1可见,即一次只有一行的Button1应该是不可见的。我已经完成了以下操作,但我不知道如何在单击的行中设置Button1的可见性。请一步一步指导我。我的适配器代码如下:

    private class ListAdapter extends BaseAdapter {
    LayoutInflater inflater;
    ViewHolder viewHolder;

    public ListAdapter(Context context) {
        // TODO Auto-generated constructor stub
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return _productlist.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return _productlist.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
    private final boolean[] mHighlightedPositions = new boolean[getCount()];
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.listview_row, null);
            viewHolder = new ViewHolder();
 viewHolder.Button1 = (Button) convertView
    .findViewById(R.id.btn_update);
    convertView.setTag(viewHolder);
    viewHolder.Button2 = (Button) convertView
    .findViewById(R.id.btn_update2);
    convertView.setTag(viewHolder);

        }
        else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
 viewHolder.Button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                 if(mHighlightedPositions[position]) {


                                viewHolder.Button1.setVisibility(convertView.INVISIBLE);     

                    }

            }
        });
        return  convertView;
    }

1 个答案:

答案 0 :(得分:0)

您需要保留上一个hidden Button视图,以便在点击其他项目Button时显示该视图。

首先,在BaseAdapter中声明一个静态变量来保存hidden Button

private static Button lastHiddenButton = null;

接下来,将点击监听器添加到Button2,然后隐藏Button1并使最后隐藏的Button可见

final Button hideButton = placeHolder.button1;
placeHolder.button2.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       // if the last hidden button is valid make it to visible
       if(lastHiddenButton != null){
           lastHiddenButton.setVisibility(View.VISIBLE);
           lastHiddenButton = null;
       }
       // hide button1
       hideButton.setVisibility(View.GONE);
       lastHiddenButton = hideButton;
        }
    });

这将确保在点击Button2时,Button1属于所点击的行将被隐藏。

通过此更改,您会注意到由于Buttons回收,其他几行ListView也会被隐藏。要解决此问题,您需要通知ListView我的所有列表项视图都不同。当您拥有ListView项时,这会对hundreds效果产生影响,但您无法避免这种情况

最后,覆盖getItemViewType中的getViewTypeCountBaseAdapter,让ListView知道所有项目视图类型都不同

@Override
public int getItemViewType(int position){
    // return a unique number
    return position;
}

@Override
public int getViewTypeCount() {
    return getCount();
}