i_raqz
i_raqz

Reputation: 2959

SwipeRefresh Programmatically

I am trying to add the swipe refresh programmatically but it doesn't work. No action on pull to refresh. Anything wrong here?

ListView listView = (ListView) findViewById(R.id.listView);
        List<String> values = new ArrayList<>();
        values.add("Hello");
        values.add("hi");
        values.add("Hello");
        values.add("hi");
        values.add("Hello");
        values.add("hi");
        values.add("Hello");
        values.add("hi");
        values.add("Hello");
        values.add("hi");
        values.add("Hello");
        values.add("hi");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values);
        listView.setAdapter(adapter);

        SwipeRefreshLayout swipeRefreshLayout = new SwipeRefreshLayout(this);
        SwipeRefreshLayout.LayoutParams swipeRefreshLayoutParams = new SwipeRefreshLayout.LayoutParams(SwipeRefreshLayout.LayoutParams.MATCH_PARENT, SwipeRefreshLayout.LayoutParams.WRAP_CONTENT);
        swipeRefreshLayout.setLayoutParams(swipeRefreshLayoutParams);
        swipeRefreshLayout.setBackgroundColor(Color.RED);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
             Log.d(TAG, "Pulled");
            }

        });
        ViewGroup r = (ViewGroup) listView.getParent();
        r.addView(swipeRefreshLayout);

Upvotes: 0

Views: 1838

Answers (1)

Shruthi Nayak
Shruthi Nayak

Reputation: 43

The current hierarchy of the views is:

ParentLayout --> ListView.

But what we want is:

ParentLayout --> SwipeToRefresh --> ListView.

  • Add swipeLayout to parent.
  • Remove the listView from the parent.
  • Add the listView to SwipeLayout.

This is because a view cannot have 2 parents.

Hence,

    final SwipeRefreshLayout swipeLayout = new SwipeRefreshLayout(context);
    ((ViewGroup) listView.getParent()).addView(swipeLayout);
    ((ViewGroup) listView.getParent()).removeView(listView);
    swipeLayout.addView(listView);

Be sure to attach onRefresh listener to the swipeRefresh layout.

Upvotes: 2

Related Questions