Android在ListAdapter中设置视图可见性

时间:2013-03-14 14:35:46

标签: android list visibility

我有listadapter的listview。我想在单击列表项中的按钮时,该项目中的特定视图(而不是其他项目中)是可见的或不可见的。

下面是我在适配器getView()方法中所做的代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {

        convertView = vi.inflate(layoutResourceId, null, false);
        holder = new Holder();
        holder.setShare((ImageView) convertView.findViewById(R.id.share));
        holder.setShareButtons((LinearLayout)convertView.findViewById(R.id.shareButtons));
        convertView.setTag(holder);


    }
    holder = (Holder) convertView.getTag();


    holder.getShare().setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            if(holder.getShareButtons().getVisibility()==View.GONE){
                holder.getShareButtons().setVisibility(View.VISIBLE);

            }
            else{
                holder.getShareButtons().setVisibility(View.GONE);

            }


        }
    });

    return convertView;
}

但我所得到的只是奇怪的行为。 onClickListener和setVisibilty方法被正确调用,但我的视图有时可见,有时不可见,这取决于列表滚动位置。

我做错了什么,我该如何解决?

3 个答案:

答案 0 :(得分:4)

滚动列表视图时,子视图将被重用并重新分配到新位置。这是为了提高效率,因为创建新视图非常昂贵。但是,它会给程序员带来负担 - 每次getView调用都必须完全重置视图的每个值。因此,如果按下子项中的按钮会更改其中一个成员的可见性,则需要记住每个数字位置的可见性,并且在getView中,您必须为每个元素设置适当的可见性。

答案 1 :(得分:1)

持有人是出于性能原因而保留对内部视图的引用。它与列表中显示的数据无关 - 仅与"单元格#34;在你的清单中。您应根据数据确定内容是否可见。

答案 2 :(得分:1)

以下是我的自定义适配器的片段,它将为您提供有关如何对适配器内的项目点击作出反应的示例:

功能:每行代表一个可以看到或看不到的对象。无论是否可见,图像都是不同的。单击项目可打开/关闭图像。

public class Exampledapter extends ArrayAdapter<CustomObject> {

    private Context mContext;
    private int mLayoutResourceId;
    private ArrayList<CustomObject> mData = null;

    public ExampleAdapter(Context context, int layoutResourceId, ArrayList<CustomObject> data, DataSource datasource) {
        super(context, layoutResourceId, data);
        this.mLayoutResourceId = layoutResourceId;
        this.mContext = context;
        this.mData = data;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View lRow = convertView;
        ViewHolder holder = null;

        if (lRow == null) {
            LayoutInflater lInflater = ((Activity) mContext).getLayoutInflater();
            lRow = lInflater.inflate(mLayoutResourceId, parent, false);

            holder = new ViewHolder();
            holder.txtTitle = (TextView) lRow.findViewById(R.id.text_);
            holder.imageSeen = (ImageView) lRow.findViewById(R.id.image_toggle);

            lRow.setTag(holder);
        } else {
            holder = (ViewHolder) lRow.getTag();
        }

        holder.imageSeen.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                onListItemClick(position);
            }
        });

        if (mData.get(position).getSeen() == 1) {
            holder.imageSeen.setImageBitmap(mImageSeen);
        } else {
            holder.imageSeen.setImageBitmap(mImageUnseen);
        }

        holder.txtTitle.setText(mData.get(position).getTitle());
        return lRow;
    }

    protected void onListItemClick(int position) {
        if (mData.get(position).isSeen()) {       
            mData.get(position).setSeen(0);
        } else {  
            mData.get(position).setSeen(1);
        }
        notifyDataSetChanged();
    }

    class ViewHolder {
        TextView txtTitle;
        ImageView imageSeen;
    }
}