Android 更改ArrayAdapter的内容不会得到更新

Android 更改ArrayAdapter的内容不会得到更新,android,android-arrayadapter,android-adapter,Android,Android Arrayadapter,Android Adapter,清除或添加数据不会在自定义ArrayAdapter类中的addData方法中得到更新。发生了什么事?我还尝试过更新输入ArrayAdapter的列表,该列表也不会更改,两次适配器中的项目数量保持不变。请帮忙 类别: package sukh.app.ireddit; import java.util.ArrayList; import java.util.Collection; import java.util.List; import android.app.Activity; impor

清除或添加数据不会在自定义ArrayAdapter类中的addData方法中得到更新。发生了什么事?我还尝试过更新输入ArrayAdapter的列表,该列表也不会更改,两次适配器中的项目数量保持不变。请帮忙

类别:

package sukh.app.ireddit;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

/**
 * While this looks like a lot of code, all this class
 * actually does is load the posts in to the listview.
 * 
 * @author Hathy 
 */
public class PostsFragment extends Fragment{

    ListView postsList;
    PostAdapter adapter;
    Handler handler;
    Activity activity;

    String subreddit;
    List<Post> posts;
    PostsHolder postsHolder;

    public PostsFragment(){
        handler=new Handler();
        posts=new ArrayList<Post>();
        activity=getActivity();
    }    

    public static Fragment newInstance(String subreddit){
        PostsFragment pf=new PostsFragment();
        pf.subreddit=subreddit;
        pf.postsHolder=new PostsHolder(pf.subreddit);        
        return pf;
    }

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container,
                             Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.posts
                                , container
                                , false);
        postsList=(ListView)v.findViewById(R.id.posts_list);
        return v;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {    
        super.onActivityCreated(savedInstanceState);
        initialize();
    }

    private void initialize(){
        // This should run only once for the fragment as the
        // setRetainInstance(true) method has been called on
        // this fragment

        if(posts.size()==0){

            // Must execute network tasks outside the UI
            // thread. So create a new thread.

            new Thread(){
                public void run(){
                    posts.addAll(postsHolder.fetchPosts());

                    // UI elements should be accessed only in
                    // the primary thread, so we must use the
                    // handler here.

                    handler.post(new Runnable(){
                        public void run(){
                            createAdapter();
                        }
                    });
                }
            }.start();
        }else{
            createAdapter();
        }
    }
   /**
     * This method creates the adapter from the list of posts
     * , and assigns it to the list.
     */
    private void createAdapter(){

        // Make sure this fragment is still a part of the activity.
        if(getActivity()==null) return;

        adapter=new PostAdapter(posts);
        postsList.setAdapter(adapter);
        Log.i("sukh", "setting adapter");
        postsList.setOnScrollListener(adapter);
    }

    protected class PostAdapter extends ArrayAdapter<Post> implements OnScrollListener {
        private int previousTotal = 0;
        private boolean loading = true;
        //PostAdapter _adapter = this;

        public PostAdapter(List<Post> posts){
            super(getActivity(), R.layout.post_item, posts);
        }   

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView == null){
                convertView = getActivity().getLayoutInflater().inflate(R.layout.post_item, null);
            }

            Post thePost = getItem(position);

            TextView postTitleTextView = (TextView) convertView.findViewById(R.id.post_title);
            postTitleTextView.setText(thePost.getTitle());

            TextView postDetailsTextView = (TextView) convertView.findViewById(R.id.post_details);
            postDetailsTextView.setText(thePost.getDetails());

            TextView postScoreTextView = (TextView) convertView.findViewById(R.id.post_score);
            postScoreTextView.setText(thePost.getScore());

            return convertView;
        }

        private void addData() {
            //final List<Post> newPosts = new ArrayList<Post>();
            Log.i("update1", this.adapterToString());
            new Thread(){
                public void run(){
                    //neither of these following statements make a difference
                    //neither does posts.clear() or posts.addAll...
                    //adapter.addAll(postsHolder.fetchMorePosts());
                    adapter.clear();
                }
            };
            Log.i("sukh", "executed scroll");       
        adapter.notifyDataSetChanged();
        Log.i("update2", this.adapterToString());
        }

        private String adapterToString() {
            StringBuilder sb = new StringBuilder();
            int total = this.getCount();
            sb.append("contents: ");
            /*for (int i = 0; i < this.getCount(); i ++) {
                sb.append(this.getItem(i).title + "/n");
            }*/
            //return sb.toString();
            return sb.append(total).toString();
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            if (loading) {
                if (totalItemCount > previousTotal) {
                    loading = false;
                    previousTotal = totalItemCount;     
                }
            }

            if (!loading && 
                    (firstVisibleItem + visibleItemCount + 1 >= totalItemCount)
                    ) {
                addData();
                loading = true;
            }

        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
        }
    }


}
包sukh.app.ireddit;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.List;
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Handler;
导入android.support.v4.app.Fragment;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AbsListView;
导入android.widget.AbsListView.OnScrollListener;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.TextView;
/**
*虽然这看起来像是很多代码,但所有这些类
*实际上是将帖子加载到listview中。
* 
*@作者哈蒂
*/
公共类PostsFragment扩展了片段{
列表视图后列表;
后适配器;
处理者;
活动;
字符串子reddit;
列出员额;
后支架后支架;
公共邮政部门(){
handler=新的handler();
posts=newarraylist();
activity=getActivity();
}    
公共静态片段newInstance(字符串subreddit){
PostsFragment pf=新的PostsFragment();
pf.subreddit=subreddit;
pf.postsHolder=新的postsHolder(pf.subreddit);
返回pf;
}
@凌驾
创建视图上的公共视图(更平坦的充气机,
视图组容器,
Bundle savedInstanceState){
视图v=充气机。充气(右布局)柱
,货柜
,假);
postsList=(ListView)v.findViewById(R.id.posts\u list);
返回v;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRetainInstance(真);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
初始化();
}
私有void初始化(){
//对于作为
//已调用setRetainInstance(true)方法
//这个片段
如果(posts.size()==0){
//必须在UI之外执行网络任务
//所以创建一个新的线程。
新线程(){
公开募捐{
posts.addAll(postsHolder.fetchPosts());
//UI元素只能在中访问
//主线程,因此我们必须使用
//我是handler。
handler.post(新的Runnable(){
公开募捐{
createAdapter();
}
});
}
}.start();
}否则{
createAdapter();
}
}
/**
*此方法从帖子列表中创建适配器
*,并将其指定给列表。
*/
私有void createAdapter(){
//确保此片段仍然是活动的一部分。
if(getActivity()==null)返回;
适配器=新的后适配器(posts);
postsList.setAdapter(适配器);
Log.i(“sukh”,“设置适配器”);
setOnScrollListener(适配器);
}
受保护类PostAdapter扩展ArrayAdapter实现OnScrollListener{
private int previousTotal=0;
私有布尔加载=真;
//PostAdapter\u适配器=此;
公共邮政适配器(列表邮件){
super(getActivity(),R.layout.post_项,posts);
}   
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=getActivity().GetLayoutFlater().充气(R.layout.post_项,空);
}
Post thePost=getItem(position);
TextView postTitleTextView=(TextView)convertView.findViewById(R.id.post_title);
postitletextview.setText(post.getTitle());
TextView postDetailsExtView=(TextView)convertView.findViewById(R.id.post_details);
postDetailsTextView.setText(post.getDetails());
TextView postScoreTextView=(TextView)convertView.findViewById(R.id.post_分数);
postScoreTextView.setText(post.getScore());
返回视图;
}
私有void addData(){
//最终列表newPosts=newarraylist();
Log.i(“update1”,this.adapterToString());
新线程(){
公开募捐{
//以下两种说法都没有区别
//posts.clear()或posts.addAll也不。。。
//adapter.addAll(postsHolder.fetchMorePosts());
适配器。清除();
}
};
Log.i(“sukh”,“已执行卷轴”);
adapter.notifyDataSetChanged();
Log.i(“update2”,this.adapterToString());
}
私有字符串适配器ostring(){
StringBuilder sb=新的StringBuilder();
int total=this.getCount();
某人附加(“内容:”);
/*for(int i=0;ipreviousTotal)
private class AddPostsTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            Log.i("update2", "start fetchMorePosts");
            posts.addAll(postsHolder.fetchMorePosts());
            Log.i("update2", "end fetchMorePosts");
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            Log.i("update2", "start adapterChange");
            adapter.notifyDataSetChanged();
            Log.i("update2", "start adapterChange");
            super.onPostExecute(result);
        }

    }