【问题标题】:How to pass a value from a custom list adapter to the Main Activity如何将值从自定义列表适配器传递到主活动
【发布时间】:2016-09-15 04:49:40
【问题描述】:

我正在尝试将自定义列表适配器中的值传递给我的主要活动。 基本上我有一个带有复选框的列表。当用户选择一个复选框时,我希望之前设置为不可见的按钮可见。如果用户取消选中列表项,我希望该按钮再次不可见。

我的列表适配器:

public class ListAdapter extends BaseAdapter
{
    private Context mContext;
    private ArrayList<Boolean> bool = new ArrayList<Boolean>();

    public ListAdapter(final Activity context)
    {
        mContext = context;

        for(int i = 0; i < ListAdapter.this.getCount(); i++)
        {
            bool.add(i, false);
        }

    }

    @Override
    public int getCount()
    {
        return AppContent.ITEMS.size();
    }

    @Override
    public Object getItem(int position)
    {
        return AppContent.ITEMS.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup     parent)
    {
        AppInfo holder;

        //Get the item at the current position
        final AppContent.AppInfo item = AppContent.ITEMS.get(position);

        if (convertView == null)
        {
            //Create the row
            final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.installed_list_row_layout, parent, false);

            holder = new AppInfo();

            //Set data to the different views
            holder.txtAppName = (TextView) convertView.findViewById(R.id.txtAppName);

            convertView.setTag(holder);
        }
        else
        {
            holder = (AppInfo) convertView.getTag();
        }

        final CheckBox chk = (CheckBox) convertView.findViewById(R.id.chkUninstall);
        chk.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //Init chkbox
                CheckBox cb = (CheckBox) v.findViewById(R.id.chkUninstall);

                if (cb.isChecked())
                {
                    bool.set(position, true); //Gets whether the checkbox is checked
                }
                else if (!cb.isChecked())
                {
                    bool.set(position, false); //Gets whether the checkbox is checked
                }
            }
        });

        //All the position values MUST be set before returning the row
        chk.setChecked(bool.get(position));

        if(item != null)
        {
            //Set data to the different views
            holder.txtAppName.setText(item.appName);
        }

        return convertView;
    }

    static class AppInfo
    {
        TextView txtAppName;
    }

    public class CheckedValues
    {
        public ArrayList<Boolean> checkedValues() { return bool; }
    }
}

我的主要活动:

public class MainActivity extends AppCompatActivity
{
    Context context;
    FloatingActionButton fab;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = MainActivity.this;

        ListView lv = (ListView) findViewById(R.id.appListView);
        lv.setDivider(null);
        ListAdapter la = new ListAdapter(MainActivity.this);
        lv.setAdapter(la);

        //Floating Action Button for uninstalling applications
        fab = (FloatingActionButton) findViewById(R.id.fab);

        //Disappear the button until the user makes a selection.
        fab.setVisibility(View.INVISIBLE);
    }

所以当用户选择一个复选框时,我希望 fab 按钮可见,而当他们取消选中它时,它是不可见的。

我最初所做的是在主要活动中创建一个公共方法。将 fab 设置为 static 并将方法本身设置为 static 然后从适配器类调用它并传递一个值。 MainActivity.isFabVisible(布尔值)。

但是,阅读本文后,我们不推荐这样做。因此,我尝试了接口和广播接收器,但没有正确实现它们。

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 使用点击监听器监听 mainActivity 列表中发生的点击。在您的适配器类中创建一个公共方法,该方法应根据复选框单击返回一个值设置 true/false。所以每当你点击某个东西时,监听器会给你位置,使用你的适配器对象访问公共方法并决定是显示还是隐藏 fab。无需为此使用接口或广播接收器。

标签: android android-activity interface listadapter


【解决方案1】:

你可以试试这个:

在您的适配器checkedchangeListener 上设置它以检查其是否已选中。将 truefalse 分别设置为 Checked未选中

if(mContext instanceof MainActivity){
                ((MainActivity)mContext).setMyVisibility(true);
            }

在你的课堂上:

public void setMyVisibility(Boolean value);
{
   if(value)
   {
     fabButton.setVisibility(View.VISIBLE);}
  else
  {
     fabButton.setVisibility(View.GONE);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多