Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 附加数据加载更多Listview_Android_Android Listview - Fatal编程技术网

Android 附加数据加载更多Listview

Android 附加数据加载更多Listview,android,android-listview,Android,Android Listview,我是Android编程新手。我有一个片段显示在Listview上,现在,我希望Listview在列表结束时加载更多的项。但数据并未追加。我需要帮助 我的代码: public class InfoTeacherFragment extends Fragment { private String URL = "http://scv.udn.vn/dhdn/trdhsp/page/"; ProgressDialog pDialog; Context mContext;

我是Android编程新手。我有一个片段显示在Listview上,现在,我希望Listview在列表结束时加载更多的项。但数据并未追加。我需要帮助

我的代码:

public class InfoTeacherFragment extends Fragment {

    private String URL = "http://scv.udn.vn/dhdn/trdhsp/page/";
    ProgressDialog pDialog;
    Context mContext;
    Vector<ArrayList<String>> data;
    ArrayList<String> Name;
    ArrayList<String> School;
    ArrayList<String> Link;
    ArrayList<String> Icon;
    ListView lvItem;
    DisplayImageOptions options;
    ImageLoader imageloader;
    View mFooterView;
    InfoTeacher adapter;
    ProgressBar loading;
    int CurrentPage = 1;
    int visibleThreshold = 3;
    int startPage = 1;
    boolean loadingMore = false;

    public InfoTeacherFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.ic_mission)
                .showImageForEmptyUri(R.drawable.ic_empty)
                .showImageOnFail(R.drawable.ic_error).cacheInMemory(true)
                .cacheOnDisk(true).considerExifParams(true)
                .bitmapConfig(Bitmap.Config.RGB_565).build();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.teacherinfo_layout,
                container, false);
        mContext = container.getContext();
        lvItem = (ListView) rootView.findViewById(R.id.lvTeacher);
        lvItem.setOnScrollListener(new EndlessScrollListener() {

            @Override
            public void onLoadMore(int page, int totalItemsCount) {
                CurrentPage++;
                customLoadMoreDataFromApi(CurrentPage);
                Toast.makeText(mContext, "EndlessScrollListener",
                        Toast.LENGTH_SHORT).show();

            }
        });
        imageloader = ImageLoader.getInstance();
        imageloader.init(ImageLoaderConfiguration.createDefault(mContext));
        if (Utils.isOnline(mContext) == true
                && Utils.KEY_CHECK_SUCCESS.equals("SUCCESS")) {
            new LoadData().execute(URL + startPage);
            lvItem.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> adapter, View view,
                        int position, long id) {

                    Intent intent = new Intent(mContext, NewsItemView.class);
                    if (Link != null) {
                        intent.putExtra("URL", Link.get(position));
                        startActivity(intent);
                    }
                }
            });
        } else if (Utils.isOnline(mContext) == true
                && Utils.KEY_CHECK_SUCCESS.equals("FAIL")) {
            Utils.MyToast(Utils.KEYWORK_ERROR[0], R.drawable.warning_icon,
                    mContext, false);
        }
        return rootView;
    }

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

    @Override
    public void onDestroy() {
        super.onDestroy();
        AnimateFirstDisplayListener.displayedImages.clear();
    }

    class LoadData extends AsyncTask<String, Void, String> {

        @Override
        protected void onPreExecute() {
            pDialog = ProgressDialog.show(mContext, "", Utils.KEYWORK_ERROR[2]);
            data = new Vector<ArrayList<String>>();
            Name = new ArrayList<String>();
            School = new ArrayList<String>();
            Link = new ArrayList<String>();
            Icon = new ArrayList<String>();
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... URL) {
            data = Utils.getInformationTeacher(URL[0]);
            if (!(data.isEmpty())) {
                return Utils.KEY_CHECK_SUCCESS;
            } else {
                return Utils.KEY_CHECK_FAIL;
            }
        }

        @Override
        protected void onPostExecute(String result) {
            if (result.equals(Utils.KEY_CHECK_SUCCESS)) {
                pDialog.dismiss();
                Name = data.get(0);
                School = data.get(1);
                Icon = data.get(2);
                Link = data.get(3);
                adapter = new InfoTeacher(mContext, Name, School, Icon);
                lvItem.setAdapter(adapter);
            } else if (result.equals(Utils.KEY_CHECK_FAIL)) {
                pDialog.dismiss();
                Utils.MyToast(Utils.KEYWORK_ERROR[0], R.drawable.warning_icon,
                        mContext, false);
            }
            super.onPostExecute(result);
        }

    }

    class InfoTeacher extends BaseAdapter {
        private ArrayList<String> Icon = new ArrayList<String>();
        private ArrayList<String> Name = new ArrayList<String>();
        private ArrayList<String> School = new ArrayList<String>();
        private LayoutInflater inflater;
        ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();

        public InfoTeacher(Context context, ArrayList<String> Name,
                ArrayList<String> School, ArrayList<String> Icon) {
            this.Name = Name;
            this.Icon = Icon;
            this.School = School;
            Collections.reverse(Name);
            Collections.reverse(School);
            Collections.reverse(Icon);
            inflater = LayoutInflater.from(getActivity());
        }

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

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

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

        @Override
        public View getView(int position, View view, ViewGroup arg2) {
            View rowView = view;
            ViewHolder holder;
            if (rowView == null) {
                holder = new ViewHolder();
                rowView = inflater
                        .inflate(R.layout.teacher_layout, arg2, false);
                holder.Name = (TextView) rowView
                        .findViewById(R.id.tv_NameTeacher);
                holder.School = (TextView) rowView.findViewById(R.id.tv_School);
                holder.ic_naviga = (ImageView) rowView
                        .findViewById(R.id.ivNaviga);
                holder.icon = (ImageView) rowView
                        .findViewById(R.id.iv_IconTeacher);
                rowView.setTag(holder);
            } else
                holder = (ViewHolder) view.getTag();
            final String mIcon = Icon.get(position);
            holder.Name.setText(Name.get(position).toString());
            holder.School.setText(School.get(position).toString());
            ImageLoader.getInstance().displayImage(mIcon, holder.icon, options,
                    animateFirstListener);
            return rowView;
        }

    }

    static class ViewHolder {
        ImageView icon;
        TextView Name;
        TextView School;
        ImageView ic_naviga;
    }

    private static class AnimateFirstDisplayListener extends
            SimpleImageLoadingListener {

        static final List<String> displayedImages = Collections
                .synchronizedList(new LinkedList<String>());

        @Override
        public void onLoadingComplete(String imageUri, View view,
                Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 500);
                    displayedImages.add(imageUri);
                }
            }
        }
    }

    public void customLoadMoreDataFromApi(int page) {
        new LoadData().execute(URL + page);
        adapter.notifyDataSetChanged();
        // This method probably sends out a network request and appends new data
        // items to your adapter.
        // Use the offset value and add it as a parameter to your API request to
        // retrieve paginated data.
        // Deserialize API response and then construct new objects to append to
        // the adapter

    }

    class LoadMoreItemsList extends
            AsyncTask<Void, Void, Vector<ArrayList<String>>> {
        private LoadMoreItemsList() {
            loadingMore = true;
            mFooterView = LayoutInflater.from(mContext).inflate(
                    R.layout.loading_view, null);
        }

        @Override
        protected void onPreExecute() {
            lvItem.addFooterView(mFooterView);
            lvItem.setAdapter(adapter);
            super.onPreExecute();
        }

        @Override
        protected Vector<ArrayList<String>> doInBackground(Void... params) {
            return null;
        }

        @Override
        protected void onPostExecute(Vector<ArrayList<String>> result) {
            super.onPostExecute(result);
        }

    }
}
最后是:抽象的EndlesScrollListener

package android.readnews.support;

import android.util.Log;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;

public abstract class EndlessScrollListener implements OnScrollListener {
    // The minimum amount of items to have below your current scroll position
    // before loading more.
    private int visibleThreshold = 5;
    // The current offset index of data you have loaded
    private int currentPage = 0;
    // The total number of items in the dataset after the last load
    private int previousTotalItemCount = 0;
    // True if we are still waiting for the last set of data to load.
    private boolean loading = true;
    // Sets the starting page index
    private int startingPageIndex = 0;

    public EndlessScrollListener() {
    }

    public EndlessScrollListener(int visibleThreshold) {
        this.visibleThreshold = visibleThreshold;
    }

    public EndlessScrollListener(int visibleThreshold, int startPage) {
        this.visibleThreshold = visibleThreshold;
        this.startingPageIndex = startPage;
        this.currentPage = startPage;
    }

    // This happens many times a second during a scroll, so be wary of the code
    // you place here.
    // We are given a few useful parameters to help us work out if we need to
    // load some more data,
    // but first we check if we are waiting for the previous load to finish.
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        // If the total item count is zero and the previous isn't, assume the
        // list is invalidated and should be reset back to initial state
        if (totalItemCount < previousTotalItemCount) {
            Log.i("abc", "ABC + totalItemCount < previousTotalItemCount");
            this.currentPage = this.startingPageIndex;
            this.previousTotalItemCount = totalItemCount;
            if (totalItemCount == 0) {
                this.loading = true;
            }
        }
        // If it’s still loading, we check to see if the dataset count has
        // changed, if so we conclude it has finished loading and update the
        // current page
        // number and total item count.
        if (loading && (totalItemCount > previousTotalItemCount)) {
            Log.i("abc", "ABC + totalItemCount > previousTotalItemCount");
            loading = false;
            previousTotalItemCount = totalItemCount;
            currentPage++;
        }

        // If it isn’t currently loading, we check to see if we have breached
        // the visibleThreshold and need to reload more data.
        // If we do need to reload some more data, we execute onLoadMore to
        // fetch the data.
        if (!loading
                && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
            Log.i("abc", "ABC + !loading");
            onLoadMore(currentPage + 1, totalItemCount);
            loading = true;
        }
    }

    // Defines the process for actually loading more data based on page
    public abstract void onLoadMore(int page, int totalItemsCount);

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // Don't take any action on changed
    }
}
包android.readnews.support;
导入android.util.Log;
导入android.widget.AbsListView;
导入android.widget.AbsListView.OnScrollListener;
公共抽象类EndlessCrollListener实现OnScrollListener{
//低于当前滚动位置的最小项目数
//在加载更多之前。
私有int visibleThreshold=5;
//已加载数据的当前偏移索引
private int currentPage=0;
//上次加载后数据集中的项目总数
private int previousTotalItemCount=0;
//如果仍在等待加载最后一组数据,则为True。
私有布尔加载=真;
//设置起始页索引
私有int startingPageIndex=0;
public endlesscrollstener(){
}
公共EndlessScrollListener(int VisibleSThreshold){
this.visibleThreshold=visibleThreshold;
}
公共EndlessScrollListener(int VisibleSThreshold,int startPage){
this.visibleThreshold=visibleThreshold;
this.startingPageIndex=startPage;
this.currentPage=起始页;
}
//在滚动过程中,这种情况每秒会发生很多次,因此要小心代码
//你可以把它放在这里。
//我们得到了一些有用的参数,以帮助我们计算出是否需要
//加载更多数据,
//但首先我们检查是否在等待前一次加载完成。
@凌驾
public void onScroll(AbsListView视图,int firstVisibleItem,
int visibleItemCount,int totalItemCount){
//如果项目总数为零,而前一个不是,则假定
//列表无效,应重置回初始状态
if(totalItemCountpreviousTotalItemCount)){
Log.i(“abc”、“abc+totalItemCount>previousTotalItemCount”);
加载=假;
previousTotalItemCount=totalItemCount;
currentPage++;
}
//如果当前未加载,我们将检查是否已违反
//VisibleSThreshold已关闭,需要重新加载更多数据。
//如果我们确实需要重新加载一些数据,我们将执行onLoadMore以
//获取数据。
如果(!正在加载

&&(totalItemCount-VisibleTItemCount)在
LoadData
AsyncTask的
onPostExecute
中,您总是使用接收到的新数据重新创建适配器,因此它不会附加现有数据


您需要做的是向
InfoTeacher
adapter添加一个方法,将新项目附加到现有数据中,然后在适配器已存在(adapter!=null)的情况下从onPostExecute调用该方法。

感谢帮助!。我将测试它。您可以在类InfoTeacher adapter中编辑我的代码并添加函数addMoreItems吗?:)对不起,我不知道。好的,非常感谢!
package android.readnews.support;

import android.util.Log;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;

public abstract class EndlessScrollListener implements OnScrollListener {
    // The minimum amount of items to have below your current scroll position
    // before loading more.
    private int visibleThreshold = 5;
    // The current offset index of data you have loaded
    private int currentPage = 0;
    // The total number of items in the dataset after the last load
    private int previousTotalItemCount = 0;
    // True if we are still waiting for the last set of data to load.
    private boolean loading = true;
    // Sets the starting page index
    private int startingPageIndex = 0;

    public EndlessScrollListener() {
    }

    public EndlessScrollListener(int visibleThreshold) {
        this.visibleThreshold = visibleThreshold;
    }

    public EndlessScrollListener(int visibleThreshold, int startPage) {
        this.visibleThreshold = visibleThreshold;
        this.startingPageIndex = startPage;
        this.currentPage = startPage;
    }

    // This happens many times a second during a scroll, so be wary of the code
    // you place here.
    // We are given a few useful parameters to help us work out if we need to
    // load some more data,
    // but first we check if we are waiting for the previous load to finish.
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        // If the total item count is zero and the previous isn't, assume the
        // list is invalidated and should be reset back to initial state
        if (totalItemCount < previousTotalItemCount) {
            Log.i("abc", "ABC + totalItemCount < previousTotalItemCount");
            this.currentPage = this.startingPageIndex;
            this.previousTotalItemCount = totalItemCount;
            if (totalItemCount == 0) {
                this.loading = true;
            }
        }
        // If it’s still loading, we check to see if the dataset count has
        // changed, if so we conclude it has finished loading and update the
        // current page
        // number and total item count.
        if (loading && (totalItemCount > previousTotalItemCount)) {
            Log.i("abc", "ABC + totalItemCount > previousTotalItemCount");
            loading = false;
            previousTotalItemCount = totalItemCount;
            currentPage++;
        }

        // If it isn’t currently loading, we check to see if we have breached
        // the visibleThreshold and need to reload more data.
        // If we do need to reload some more data, we execute onLoadMore to
        // fetch the data.
        if (!loading
                && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
            Log.i("abc", "ABC + !loading");
            onLoadMore(currentPage + 1, totalItemCount);
            loading = true;
        }
    }

    // Defines the process for actually loading more data based on page
    public abstract void onLoadMore(int page, int totalItemsCount);

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // Don't take any action on changed
    }
}