Android ListView仅显示重复的前4项

时间:2015-02-17 16:38:06

标签: android listview android-listview

我有一个名为 用户管理 的片段,我从服务器收集数据并将其显示在ListView中。它也可以通过SwipeRefreshLayout刷新。

如果我获得1-4个用户的数据,它会正确显示数据。但是,如果我获得超过4个用户的数据,它会正确地显示前4个,而不是第五个,它是第一个,而不是第6个,它是第二个,依此类推等等。

我已经尝试了所有我能想到的东西,适配器正确地获取数据,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>

谢谢!

5 个答案:

答案 0 :(得分:1)

您的SampleAdapter.getView()方法存在严重问题。

当您向下滚动时,屏幕顶部消失的View将重新用于注入底部。重复使用的ViewconvertView getView参数。

在您编写代码时,重复使用的视图将注入完全相同的数据(因为滚动时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));
    ...
}

答案 1 :(得分:0)

这种方法看起来很奇怪,也许是可疑的。我没有在这个示例代码中的任何地方看到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());
    }

}

答案 2 :(得分:0)

这是因为你没有在

中做任何事情
else {

            convertView.getTag();

        }

点击这里

Why we should re-assign values for a recycled convertView in getView()

您必须使用第5行,第6行等的数据将值重新分配给convertView,否则它仍包含旧数据

答案 3 :(得分:0)

删除顶部的holder的初始化,只需将这行代码放在getView函数的开头。

ViewHolder holder = null;

如果持有者为null,则需要重新初始化持有者,如果非null,则需要使用最新数据更新持有者。

答案 4 :(得分:0)

请参阅此示例,它可能会对您有所帮助

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