ActionBar - PullToRefresh以编程方式实现而不使用样式

时间:2014-02-25 16:53:18

标签: android android-actionbar pull-to-refresh

目前我使用Styles.xml结合java代码来定义PullToRefresh自定义。我想只通过java代码进行所有自定义,而不是用XML定义它们。我可以以编程方式实现所有自定义吗?

这是我的xml自定义:

<!-- PullToRefresh Customizations -->
<style name="Theme.Holo.CustomPtrHeader" parent="Theme.Sherlock">
    <item name="ptrHeaderStyle">@style/Widget.Custom.PtrHeader</item>
</style>

<style name="Widget.Custom.PtrHeader" parent="android:Widget">

    <!-- The background of the header view -->
    <item name="ptrHeaderBackground">#FF69B4</item>

    <!-- Color to tint the progress bar -->
    <item name="ptrProgressBarColor">#FF69B4</item>

    <!-- The strings to be displayed at the various states -->
    <item name="ptrPullText">Pull To Refresh</item>
    <item name="ptrRefreshingText">Refreshing News</item>
    <item name="ptrReleaseText">Loading...</item>
</style>

Java代码:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ViewGroup viewGroup = (ViewGroup) view;

    mPullToRefreshLayout = new PullToRefreshLayout(activity);
    ActionBarPullToRefresh
            .from(activity)
            .insertLayoutInto(viewGroup)
            .theseChildrenArePullable(R.id.gridview_news_grid,
                    android.R.id.empty).listener(this)
            .setup(mPullToRefreshLayout);
}


@Override
public void onRefreshStarted(View view) {

    if (Const.DEBUGGING)
        Log.d(Const.DEBUG, "PullToRefresh Started");

    gridview.setVisibility(View.INVISIBLE);

    new AsyncTask<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            getDataFromServer();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            mPullToRefreshLayout.setRefreshComplete();
            if (getView() != null) {
                gridview.setVisibility(View.VISIBLE);
            }
        }
    }.execute();
}

我认为我可以使用Options()来执行此操作,但不确定如何正确执行此操作。有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:9)

好的..所以我确实调查了很多,这就是我解决问题的方法。我们可以使用DefaultHeaderTransformer类完全控制“PullToRefresh”。我从Styles.xml中删除了“PullToRefresh”自定义,并使用下面的代码更改进度条的颜色并查看整个背景。您可以根据需要对其进行试验。如果您有任何问题,我可以回答。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ViewGroup viewGroup = (ViewGroup) view;

    mPullToRefreshLayout = new PullToRefreshLayout(activity);
    ActionBarPullToRefresh
            .from(activity)
            .options(Options.create().scrollDistance(.75f).build())
            .insertLayoutInto(viewGroup)
            .theseChildrenArePullable(R.id.gridview_features_grid,
                    android.R.id.empty).listener(this)
            .setup(mPullToRefreshLayout);       

    DefaultHeaderTransformer transformer = (DefaultHeaderTransformer) mPullToRefreshLayout
            .getHeaderTransformer();
    transformer.getHeaderView().findViewById(R.id.ptr_text)
            .setBackgroundColor(getResources().getColor(R.color.blue));
    transformer.setProgressBarColor(getResources().getColor(R.color.blue));
}

截图:

enter image description here

enter image description here