如何从适配器访问 ListView

Posted

技术标签:

【中文标题】如何从适配器访问 ListView【英文标题】:How do I access to ListView from the adapter 【发布时间】:2012-06-10 06:11:02 【问题描述】:

我有一个自定义的ListView 和我自己的适配器。我正在处理我的ListView 项目中对Button 的点击,我希望ListView 在这次点击中变得不可见。

我不知道如何从适配器访问ListView

public class ScheduleArrayAdapter extends ArrayAdapter<ScheduleListItem> 

    /*...*/
    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        View v = convertView;
        if (v == null) 
            LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(id, null);
        
        final ScheduleListItem o = items.get(position);
        if (o != null) 

        /*...*/         

            Button details=(Button)v.findViewById(R.id.btn_details);
            details.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    //HOW TO MAKE (R.id.lv_schedule) TO BECOME INVISIBLE HERE?
                
            );
        
        return v;
    

【问题讨论】:

我认为拥有适配器的全部意义在于将逻辑与 ListView 分离。 【参考方案1】:

ViewGroup parent 持有对getView() 返回的View 的父级的引用,在您的情况下是您的自定义列表视图。

@Override
public View getView(int position, View convertView, final ViewGroup parent) 
    ...
    details.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            parent.setVisibility(View.INVISIBLE); // or View.GONE
        
    );
    ...
    return v;

【讨论】:

【参考方案2】:

除此之外,您可以通过适配器的构造函数传递 Listview 的引用并将其存储在本地 Listview 变量中。您可以使用它来访问您的 Listviews 方法。像这样

public ViewPackagesAdapter(Activity mActivity, ListView cmgListView) 
        this.mActivity = mActivity;
        this.mListView=cmgListView;
    

现在通过mListView访问Activity的Listview..

【讨论】:

【参考方案3】:

在我的情况下,GridItemClickListner 出于某种原因没有工作。我使用这个

从适配器类访问Gridview
public View getView(final int position, View convertView, ViewGroup parent) 
        convertView.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
          ((ClockGridView) v.getParent()).performItemClick(v, position, v.getId());
                         (OR)
           ((ClockGridView)parent).performItemClick(v, position, v.getId());
   
 );

“ClockGridView”扩展“GridView”类。

【讨论】:

以上是关于如何从适配器访问 ListView的主要内容,如果未能解决你的问题,请参考以下文章

ListView:如何从外部以编程方式访问 Item 的元素?

ListView:如何从列表中访问视图以更改背景颜色?

如何从适配器知道 ListView 的项目是不是可见?

从按钮 OnClick 方法中访问 listview/arrayadapter

如何从自定义 ListView 适配器传递 Intent Extra?

如何使用复选框和自定义适配器从 Listview 中获取选定的列表项?