簡體   English   中英

Android ListView僅顯示重復的前4個項目

[英]Android ListView showing only first 4 items on repeat

我有一個稱為“ 用戶管理”的片段,在其中我從服務器收集數據並將其顯示在ListView中。 也可以通過SwipeRefreshLayout刷新。

發生的是,如果我獲得1-4個用戶的數據,它將正確顯示數據。 但是,如果我獲得的數據超過4個,它會正確顯示前四個,而不是第五個,而是第一個,而不是第六個,它是第二個,依此類推。

我已經嘗試了所有可能想到的方法,適配器正確地獲取了數據,ListView正確地獲得了適配器,但是由於某種原因,它在顯示的4個用戶處達到峰值,然后簡單地重復它們(有趣的是,如果我添加一個用戶然后刷新,它只會在列表中再重復下一個用戶,因此,它肯定知道用戶數量的變化)

你能幫我發現問題嗎?

java類:

package com.softwarenation.jetfuel.fragments.userManagement;

import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.ListFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.VolleyError;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.softwarenation.jetfuel.R;
import com.softwarenation.jetfuel.activities.MainActivity;
import com.softwarenation.jetfuel.fragments.Stations;
import com.softwarenation.jetfuel.managers.JetfuelManager;
import com.softwarenation.jetfuel.managers.StatusManager;
import com.softwarenation.jetfuel.managers.UserManager;
import com.softwarenation.jetfuel.utility.Global;
import com.softwarenation.jetfuel.utility.GlobalConnection;
import com.softwarenation.jetfuel.utility.users.User_pictures;
import com.softwarenation.jetfuel.utility.users.Users_mana;

import org.nicktate.projectile.Method;
import org.nicktate.projectile.Projectile;
import org.nicktate.projectile.StringListener;

import java.io.InputStream;
import java.util.ArrayList;


public class UserManagement extends Fragment {
    private SwipeRefreshLayout swipeRefreshLayout;
    //private View refreshView;
    private Global font = new Global();
    private ListView listView;
    private ArrayList<User_pictures> pictureses = new ArrayList<User_pictures>();
    private static boolean isfirst = false;


    private PullToRefreshListView pullToRefreshView;

    /**---------------------------------------------------------------------------------------------*/
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

    }



    /**---------------------------------------------------------------------------------------------*/


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_usermanagemnet, container, false);
        listView = (ListView)rootView.findViewById(R.id.list);
        swipeRefreshLayout = (SwipeRefreshLayout)rootView.findViewById(R.id.swipe);
      //  refreshView = (View) rootView.findViewById(R.id.swipe);

        //First time, we get the data from a server, then only display that data until the user calls for a refresh
        if(!StatusManager.getInstance().getUsermStatus()){
            UsersTask usersTask = new UsersTask();
            usersTask.execute();
        }else{
            setContent();
        }



        Button addUser = (Button)rootView.findViewById(R.id.addUser_button);
        addUser.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Fragment fragment = new AddUser();
                FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
            }
        });


        // Set a listener to be invoked when the list should be refreshed.




        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                                                            @Override
                                                            public void onRefresh() {
                                                                Log.e("start","onRefresh");
                                                                new GetDataTask().execute();
                                                            }
                                                        }
        );










       /* pullToRefreshView = (PullToRefreshListView)rootView.findViewById(R.id.pull_to_refresh_listview);
        pullToRefreshView.bringToFront();
        pullToRefreshView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
            @Override
            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                // Do work to refresh the list here.
                new GetDataTask().execute();
            }
        });*/

        return rootView;
    }


public void setOnRefreshListener (SwipeRefreshLayout.OnRefreshListener listener){
    swipeRefreshLayout.setOnRefreshListener(listener);
}

public boolean isRefreshing(){
    return swipeRefreshLayout.isRefreshing();
}


    public void setRefreshing(boolean refreshing){
        swipeRefreshLayout.setRefreshing(refreshing);
    }


    public SwipeRefreshLayout getSwipeRefreshLayout(){
        return swipeRefreshLayout;
    }


    //on refresh, get new data from the server
    private class GetDataTask extends AsyncTask<Void, Void, String[]> {

        @Override
        protected String[] doInBackground(Void... voids) {Log.e("start","GetDataTask");
            UsersTask usersTask = new UsersTask();
            usersTask.execute();
            return new String[0];
        }

        @Override
        protected void onPostExecute(String[] result) {
            // Call onRefreshComplete when the list has been refreshed.
          //  pullToRefreshView.onRefreshComplete();
            super.onPostExecute(result);
            MainActivity.setBackDisabled(false);
            Log.e("GetDataTask","completed");
        }
    }






    private class SampleItem {
        public String id;
        public String title;
        public String username;
        public String groupName;
        public int userPicture;
        public int editPicture;
        public int dPicture;
        public String activated;

        public SampleItem(String id, String title, String username, String groupName, int userPicture, int editPicture, int dPicture, String activated ) {
            this.id = id;
            this.title = title;
            this.username = username;
            this.groupName = groupName;
            this.userPicture = userPicture;
            this.editPicture = editPicture;
            this.dPicture = dPicture;
            this.activated = activated;
        }

    }




    static class ViewHolder {
        private String checkBox;
        private RelativeLayout relativeLayout;
        private LinearLayout linearLayout;
        private RelativeLayout relativeLayout2;

        public void setCheckBox(String checkBox) {
            this.checkBox = checkBox;
        }

        public void setLinearLayout(LinearLayout linearLayout) {
            this.linearLayout = linearLayout;
        }

        public void setRelativeLayout(RelativeLayout relativeLayout) {
            this.relativeLayout = relativeLayout;
        }

        public void setRelativeLayout2(RelativeLayout relativeLayout2) {
            this.relativeLayout2 = relativeLayout2;
        }

        public LinearLayout getLinearLayout() {
            return linearLayout;
        }

        public RelativeLayout getRelativeLayout() {
            return relativeLayout;
        }

        public RelativeLayout getRelativeLayout2() {
            return relativeLayout2;
        }

        public RelativeLayout getCheckBox() {
            return relativeLayout;
        }

    }



    public class SampleAdapter extends ArrayAdapter<SampleItem> {
        final ViewHolder holder = new ViewHolder();

        public SampleAdapter(Context context) {
            super(context, 0);
        }

        public View getView(final int position, View convertView, ViewGroup parent) {

            if (convertView == null) {
                convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_usermana, null);


                ImageView userPicture = (ImageView)convertView.findViewById(R.id.userpicture);
                userPicture.setImageDrawable(getResources().getDrawable(getItem(position).userPicture));

                TextView title = (TextView)convertView.findViewById(R.id.user_name);
                font.setFont(title, 3, getActivity());
                title.setText(getItem(position).title);

                TextView username = (TextView)convertView.findViewById(R.id.username);
                font.setFont(username, 2, getActivity());
                username.setText(getItem(position).username);

                TextView groupname = (TextView)convertView.findViewById(R.id.groupName);
                font.setFont(groupname, 2, getActivity());
                groupname.setText(getItem(position).groupName);

                ImageView useredit = (ImageView)convertView.findViewById(R.id.editbutton);
                useredit.setImageDrawable(getResources().getDrawable(getItem(position).editPicture));
                useredit.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        Bundle bundle = new Bundle();
                        bundle.putString("user_id", getItem(position).id);


                        Fragment fragment = new EditProfile();
                        fragment.setArguments(bundle);
                        FragmentManager fragmentManager = getFragmentManager();
                        fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
                    }
                });

                /**---------------*/

                ImageView userdelate = (ImageView)convertView.findViewById(R.id.deletebutton);
                userdelate.setImageDrawable(getResources().getDrawable(getItem(position).dPicture));

                holder.setLinearLayout((LinearLayout)convertView.findViewById(R.id.lin_show_profile));



                //LinearLayout show = (LinearLayout)convertView.findViewById(R.id.lin_show_profile);
                holder.getLinearLayout().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        Bundle bundle = new Bundle();
                        bundle.putString("user_id", getItem(position).id);


                        Fragment fragment = new ShowProfile();
                        fragment.setArguments(bundle);
                        FragmentManager fragmentManager = getFragmentManager();
                        fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
                    }
                });


                //
                holder.setRelativeLayout((RelativeLayout)convertView.findViewById(R.id.delate_user));
                //RelativeLayout delete_user = (RelativeLayout)convertView.findViewById(R.id.delate_user);
                holder.getRelativeLayout().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        DialogStop("Are you sure?", getItem(position).username, getActivity(), getItem(position).id);

                    }
                });
                //
                //holder.setCheckBox(getItem(position).activated);
                //
                /**---------------*/
                //Red or Blue background
                // RelativeLayout settings = (RelativeLayout)convertView.findViewById(R.id.settingsbutton);
                holder.setRelativeLayout2((RelativeLayout) convertView.findViewById(R.id.settingsbutton));

                //if(getItem(position).activated.equals("false")) {

                if (getItem(position).activated.equals("false")) {
                    holder.getLinearLayout().setBackground(getResources().getDrawable(R.drawable.discrepancy_background_red));
                    holder.getRelativeLayout().setBackground(getResources().getDrawable(R.drawable.discrepancy_background_red));
                    holder.getRelativeLayout2().setBackground(getResources().getDrawable(R.drawable.discrepancy_background_red));

                }

                //holder.setCheckBox(getItem(position).activated);
                convertView.setTag(holder);

            } else {

                convertView.getTag();

            }


            return convertView;
        }

    }




    public void DialogStop(String title, String message,Context context, final String id){
        new AlertDialog.Builder(context)
                .setTitle(title)
                .setMessage(message)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        //dialog.cancel();

                        DeleteTask deleteTask = new DeleteTask();
                        deleteTask.execute(id);
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();

                    }
                })
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show();
    }



    private class DeleteTask extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String... params) {
            String response = null;

            try {
                response = new GlobalConnection().DELETE( getString(R.string.apicdeleteuser) + params[0].toString() );
                Log.v("response", response + "");
            } catch (Exception e) {
                e.printStackTrace();
            }

            return response;
        }

        @Override
        protected void onPostExecute(String response) {
            Log.v("response", response + "");
        }
    }








    private class UsersTask extends AsyncTask<String, Void, ArrayList<Users_mana>> {

        @Override
        protected ArrayList<Users_mana> doInBackground(String... strings) {
            //Users_mana users = null;
            String response = null;
            ArrayList<Users_mana> users_manas = null;

            try{Log.e("start","GET via GlobalConnection()");
                response = new GlobalConnection().GET( getString(R.string.apiusers));
                users_manas = new Gson().fromJson(response, new TypeToken<ArrayList<Users_mana>>(){}.getType());
                Log.e("start","setUsers_mana");
                UserManager.getInstance().setUsers_mana(users_manas);


            }catch (Exception e){
                Log.e("response error", e.getMessage().toString());
            }

            return users_manas;
        }


        @Override
        protected void onPostExecute(ArrayList<Users_mana> response) {

            if(!response.isEmpty()) {Log.e("start","setContent()");
                setContent();
                StatusManager.getInstance().setUsermStatus(true);
                Log.e("UsermStatus:",String.valueOf(StatusManager.getInstance().getUsermStatus()));
            }

            super.onPostExecute(response);
        }

    }




    private void setContent(){
        SampleAdapter adapter = new SampleAdapter(getActivity());

        adapter.notifyDataSetChanged();

        try {
            if (!UserManager.getInstance().getUsers_mana().isEmpty()) {

                for (int i = 0; i < UserManager.getInstance().getUsers_mana().size(); i++) {

Log.e("adding to adapter:",UserManager.getInstance().getUsers_mana().get(i).firstName + " " + UserManager.getInstance().getUsers_mana().get(i).lastName + "" + UserManager.getInstance().getUsers_mana().get(i).id + "" + UserManager.getInstance().getUsers_mana().get(i).username + "group:" + UserManager.getInstance().getUsers_mana().get(i).group);
                    adapter.add(new SampleItem(
                            UserManager.getInstance().getUsers_mana().get(i).id
                            , UserManager.getInstance().getUsers_mana().get(i).firstName + " " + UserManager.getInstance().getUsers_mana().get(i).lastName
                            , UserManager.getInstance().getUsers_mana().get(i).username
                            , UserManager.getInstance().getUsers_mana().get(i).group
                            , R.drawable.users_test
                            , R.drawable.settings
                            , R.drawable.delete
                            , UserManager.getInstance().getUsers_mana().get(i).activated
                    ));

                }

                listView.setAdapter(adapter);Log.e("setting","ListView");
            }

        }catch (Exception e){
            Log.e("error setContent", e.getMessage().toString());
        }

    }


    /*
    private class PicturesTask extends AsyncTask<String, String ,String>{

        @Override
        protected String doInBackground(String... urls) {

            //String urldisplay = urls[0];
            Bitmap mIcon11 = null;
            try {
                for(int i = 0; i < urls.length; i++) {
                    if(UserManager.getInstance().getUsers_mana().get(i).photo != null) {

                        InputStream in = new java.net.URL(getString(R.string.jetfuel_url ) + UserManager.getInstance().getUsers_mana().get(i).username).openStream();
                        mIcon11 = BitmapFactory.decodeStream(in);

                        pictureses.add(new User_pictures(mIcon11, UserManager.getInstance().getUsers_mana().get(i).username, UserManager.getInstance().getUsers_mana().get(i).id));
                        UserManager.getInstance().setUserPictureses(pictureses);
                    }
                }
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            if(!UserManager.getInstance().getUserPictureses().isEmpty()) {
                for (int i = 0; i < UserManager.getInstance().getUserPictureses().size(); i++) {
                    Log.v("pictures", UserManager.getInstance().getUserPictureses().get(i).picture + "");
                }
            }
            super.onPostExecute(s);
        }
    }
    */







    /**---------------------------------------------------------------------------------------------*/

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.main, menu);

        //menu.removeItem(R.id.Station);
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case R.id.Station:

                Fragment fragment = new Stations();
                FragmentManager fragmentManager = getFragmentManager();
                    fragmentManager.beginTransaction().replace(R.id.content_frame,     fragment).commit();

                return true;

            default:

                return super.onOptionsItemSelected(item);

        }

    }
    /**---------------------------------------------------------------------------------------------*/

}

xml視圖:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">




<LinearLayout
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/blue">







    <Button
        android:id="@+id/addUser_button"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:text="@string/add_user"

        android:background="@drawable/button_yellow_background"
        android:textStyle="bold"
        android:textSize="20sp"
        android:textColor="@color/blue"/>

    <android.support.v4.widget.SwipeRefreshLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:android="http://schemas.android.com/apk/res/android"


    android:id="@+id/swipe">


    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@color/blue"
        />

    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>



</RelativeLayout>

謝謝!

SampleAdapter.getView()方法中存在一個巨大的問題。

向下滾動時,屏幕頂部的消失的View將重新用於底部的注入。 此重用的View是您作為getView參數獲取的convertView

就像您編寫代碼一樣,重用的視圖將注入完全相同的數據(因為if (convertView == null) {滾動時始終為false)。

圖片和文字不會更新。

向下滾動時,頂部消失的元素只會出現在底部,其他元素也會消失...

您應該執行以下操作:

public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_usermana, null);

        // The ViewHolder constructor should handle the mapping of its views
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    // Here you should only use holder as in:
    holder.userpicture.setImageDrawable(getResources().getDrawable(getItem(position).userPicture));
    ...
}

這種方法看起來很奇怪,並且可能令人懷疑。 在此示例代碼中的任何地方都沒有看到getUsers_mana()定義,因此我不知道這是否是問題。 首先,您應該分別調用“ UserManager.getInstance()。getUsers_mana()”,然后分別調用“ get(i)”,並將結果存儲在變量中。

private void setContent(){
    SampleAdapter adapter = new SampleAdapter(getActivity());

    adapter.notifyDataSetChanged();

    try {
        if (!UserManager.getInstance().getUsers_mana().isEmpty()) {

            for (int i = 0; i < UserManager.getInstance().getUsers_mana().size(); i++) {

Log.e("adding to adapter:",UserManager.getInstance().getUsers_mana().get(i).firstName + " " + UserManager.getInstance().getUsers_mana().get(i).lastName + "" + UserManager.getInstance().getUsers_mana().get(i).id + "" + UserManager.getInstance().getUsers_mana().get(i).username + "group:" + UserManager.getInstance().getUsers_mana().get(i).group);
                adapter.add(new SampleItem(
                        UserManager.getInstance().getUsers_mana().get(i).id
                        , UserManager.getInstance().getUsers_mana().get(i).firstName + " " + UserManager.getInstance().getUsers_mana().get(i).lastName
                        , UserManager.getInstance().getUsers_mana().get(i).username
                        , UserManager.getInstance().getUsers_mana().get(i).group
                        , R.drawable.users_test
                        , R.drawable.settings
                        , R.drawable.delete
                        , UserManager.getInstance().getUsers_mana().get(i).activated
                ));

            }

            listView.setAdapter(adapter);Log.e("setting","ListView");
        }

    }catch (Exception e){
        Log.e("error setContent", e.getMessage().toString());
    }

}

這是因為您在

else {

            convertView.getTag();

        }

在這里檢查

為什么我們應該在getView()中為回收的convertView重新分配值

您必須使用第5個roq,第6行等數據將值重新分配給convertView,否則它仍包含舊數據

刪除頂部的holder的初始化,然后將這行代碼放在getView函數的開頭。

ViewHolder holder = null;

如果其為null,則需要重新初始化holder;如果其不為null,則需要使用最新數據進行更新。

查看此示例可能會對您有所幫助

https://github.com/erikwt/PullToRefresh-ListView

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM