【问题标题】:Android PullToRefreshListView Issue while releasedAndroid PullToRefreshListView 发布时出现问题
【发布时间】:2014-07-15 06:43:52
【问题描述】:

我在我的应用程序中使用PullToRefreshListView 库。但我面临一个问题。当Listview 被释放时,ListView 从底部滚动出 UI 的部分会在一段时间内保持空白。解决这个问题的建议或者可能是一些更稳定的库?

截图以更好地解释问题;

状态“A”是正常视图,而“B”是刷新视图。虽然空白部分,即蓝色矩形中的区域,很快消失了,但它确实出现了很长一段时间。

这是我的布局 XML。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <eu.erikw.PullToRefreshListView
        android:id="@+id/pull_to_refresh_listview"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"        
        android:background="@android:color/white"
        android:cacheColorHint="@android:color/white" />

</RelativeLayout>

最后这是我的Activity 代码。

public class MainActivity extends Activity {

    private PullToRefreshListView listView;
    private PullToRefreshListViewSampleAdapter adapter;
    private int REF_TIMEOUT = 2000;

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

        listView = (PullToRefreshListView) findViewById(R.id.pull_to_refresh_listview);

        View searchView = getLayoutInflater().inflate(R.layout.search_header, null, false);
        EditText chatUsersSearch = (EditText) searchView.findViewById(R.id.chat_users_search);
        listView.addHeaderView(searchView);

        listView.setOnRefreshListener(new OnRefreshListener() {

            @Override
            public void onRefresh() {

                adapter.loadData();

                listView.postDelayed(new Runnable() {


                    @Override
                    public void run() {
                        listView.onRefreshComplete();
                    }
                }, REF_TIMEOUT);
            }
        });

        adapter = new PullToRefreshListViewSampleAdapter() {};
        listView.setAdapter(adapter);

        // Request the adapter to load the data
        adapter.loadData();

        // click listener
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {

                ViewHolder viewHolder = (ViewHolder) arg1.getTag();
                if (viewHolder.name != null){
                    Toast.makeText(MainActivity.this, viewHolder.name.getText(), Toast.LENGTH_SHORT).show();
                }                   
            }
        });

    }


    /**
     * The adapter used to display the results in the list
     * 
     */
    public abstract class PullToRefreshListViewSampleAdapter extends android.widget.BaseAdapter {

        private ArrayList<String> items = new ArrayList<String>();;

        public class ViewHolder {
            public String id;
            public TextView name;
        }

        /**
         * Loads the data. 
         */
        public void loadData() {

            // Here add your code to load the data for example from a webservice or DB

            // items = new ArrayList<String>();

            items.add("Ajax Amsterdam");
            items.add("Barcelona");
            items.add("Manchester United");

            // MANDATORY: Notify that the data has changed
            notifyDataSetChanged();
        }

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

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

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

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

            String record = (String) getItem(position);

            LayoutInflater inflater = MainActivity.this.getLayoutInflater();

            ViewHolder viewHolder = new ViewHolder();

            if (convertView == null){
                rowView = inflater.inflate(R.layout.list_item,null);

                viewHolder.name = (TextView) rowView.findViewById(R.id.textView1);

                rowView.setTag(viewHolder);
            }

            final ViewHolder holder = (ViewHolder) rowView.getTag();

            holder.name.setText(record); 

            return rowView;
        }
    }

}

谢谢,

阿马尔

【问题讨论】:

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


    【解决方案1】:

    你试过这种方式吗,

            listView.setOnRefreshListener(new OnRefreshListener() {
    
                @Override
                public void onRefresh() {
                    // Your code to refresh the list contents goes here
    
                    // For the sake of this sample, the code will pause here to
                    // force a delay when invoking the refresh
                    listView.postDelayed(new Runnable() {
    
                        @Override
                        public void run() {
                            listView.onRefreshComplete();
                        }
                    }, 20);
                }
            });
    

    编辑:

    PullToRefreshListView 库可能存在的错误的最终解决方案,

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    
        <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:background="@drawable/background"
        android:orientation="vertical" >
    
            <eu.erikw.PullToRefreshListView
                android:id="@+id/pull_to_refresh_listview"
                android:layout_height="fill_parent"
                android:layout_width="fill_parent"        
                android:background="@android:color/white"
                android:cacheColorHint="@android:color/white" />
        </LinearLayout> 
    </RelativeLayout>
    

    【讨论】:

    • 是的,我试过了。问题不在于标题。
    • 可能是您阻塞 UI 线程的地方。在更新或从 Web 服务获取数据以获取列表时,请勿进行任何 UI 更改。
    • 这也是给定示例项目的行为方式。您是否使用过这个库而没有遇到这个问题?
    • 是的,我用过同一个库,没有遇到这样的问题。
    • 我添加了一个截图来解释这个问题。请看一看。
    【解决方案2】:

    使用 android swiperefreshlayout :

    http://antonioleiva.com/swiperefreshlayout/

    我看到你之前在这里写的这个问题,这不是这个库的唯一问题。使用谷歌支持库。

    【讨论】:

    • 我肯定会尝试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多