更新ListView记录重复的Android

时间:2013-05-03 08:27:32

标签: android android-listview

我在列表视图中显示了15条记录的限制。成功显示了15条记录,但当我点击加载更多按钮时,它还添加了之前的15条记录和新记录。这是我的异步任务,其中添加了更多记录。我使用articlesAdapter.notifyDataSetChanged();设置也是,但问题仍然存在。我相信它与articlesFiltered.size()/ 15)+1。

有关
public class ActusScreen extends BaseActivity implements OnClickListener {

    private DisplayImageOptions options;
    ImageLoader imageLoader;
    String link;
    //...
    final int NONE=0;
    final int THEME=1;
    final int SEARCH=2;
    final int THEME_TO_SEARCH=3;
    final int SEARCH_RESULTS=4;
    final int THEME_TO_SEARCH_RESULTS=5;
    int MODE=NONE;

    public ArrayList<Article> articles;
    public ArrayList<Article> articlesFiltered;
    public ArrayList<Theme> themes;
    public ArrayList<Theme> themeFiltered;

    public static int titleIndex=0;
    static boolean original_view = false;

    RelativeLayout adLayout;
    ListView themesList;
    RelativeLayout searchLayout;
    EditText searchField;
    Button back, theme;

    StringBuilder builder;

    ScrollView scrollme;

    ThemesAdapter themeAdapter;
    ArticlesAdapter articlesAdapter;
    TextView header_text;
    ActusScreen context;
    ProgressDialog pd;
    ImageView image_actus;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.actus);
        context=this;

        back=(Button)findViewById(R.id.envoye);
        back.setOnClickListener(this);
        back.setVisibility(View.GONE);

        theme=(Button)findViewById(R.id.theme);
        theme.setOnClickListener(this);
        Button search=(Button)findViewById(R.id.search);
        search.setOnClickListener(this);

        header_text = (TextView)findViewById(R.id.text_titre);
        header_text.setText(getResources().getText(R.string.actus).toString());

        adLayout=(RelativeLayout)findViewById(R.id.adLayout);

        themeAdapter=new ThemesAdapter(this);
        themesList=(ListView)findViewById(R.id.themesList);
        themesList.setAdapter(themeAdapter);
        themesList.setVisibility(View.GONE);

        SelectedArticle.mtypo=1;

        articlesAdapter=new ArticlesAdapter(this);
        ListView articlesList=(ListView)findViewById(R.id.articlesList);
        articlesList.setAdapter(articlesAdapter);

        searchLayout=(RelativeLayout)findViewById(R.id.searchLayout);
        searchLayout.setVisibility(View.GONE);
        searchField=(EditText)findViewById(R.id.keyword);
        Button valid=(Button)findViewById(R.id.valid);
        valid.setOnClickListener(this);


        new GetAllArticlesTask().execute();

        image_actus = (ImageView)findViewById(R.id.image);
        image_actus.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                String url = link;
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setData(Uri.parse(url));
                startActivity(i);

            }
        });

        options = new DisplayImageOptions.Builder()
    //  .showStubImage(R.drawable.ic_launcher)
        .displayer(new RoundedBitmapDisplayer(3))
        .cacheInMemory()
        .cacheOnDisc()
        .build();

        imageLoader = ImageLoader.getInstance();
        imageLoader.init(ImageLoaderConfiguration.createDefault(getApplicationContext()));

        new backTask().execute("");
    }


    @Override
    protected void onStart() {
        // TODO Auto-generated method stub

        //FavoriteScreen.flagx=1;
        super.onStart();
    }


    @Override
    public void onClick(View v) {   
        switch(v.getId()){
        case R.id.envoye:
            back();
            break;
        case R.id.theme:
            if(themesList.getVisibility()==View.VISIBLE)
                themesList.setVisibility(View.GONE);
            else
                themesList.setVisibility(View.VISIBLE);
            break;
        case R.id.search:
            search();
            break;
        case R.id.valid:
            searchLayout.setVisibility(View.GONE);
            if(MODE==SEARCH)
                MODE=SEARCH_RESULTS;
            else
                MODE=THEME_TO_SEARCH_RESULTS;
            filterArticles();
            break;
        }
    }

    public void search(){
        switch(MODE){
        case SEARCH_RESULTS:
            searchLayout.setVisibility(View.VISIBLE);
            MODE=SEARCH;
            break;
        case THEME_TO_SEARCH_RESULTS:
            searchLayout.setVisibility(View.VISIBLE);
            MODE=THEME_TO_SEARCH;
            break;
        case THEME:
            searchLayout.setVisibility(View.VISIBLE);
            MODE=THEME_TO_SEARCH;
            break;
        case NONE:
            searchLayout.setVisibility(View.VISIBLE);
            back.setVisibility(View.VISIBLE);
            theme.setVisibility(View.GONE);
            MODE=SEARCH;
            break;

        }
    }

    public void back(){
        switch(MODE){
        case SEARCH_RESULTS:
            searchLayout.setVisibility(View.VISIBLE);
            MODE=SEARCH;
            break;
        case THEME_TO_SEARCH_RESULTS:
            searchLayout.setVisibility(View.VISIBLE);
            MODE=THEME_TO_SEARCH;
            break;
        case THEME:

            back.setVisibility(View.GONE);
            theme.setVisibility(View.VISIBLE);

            /*
             * 
            Intent intent = getIntent();
            finish();
            startActivity(intent);
            */

             articlesAdapter=new ArticlesAdapter(this);
             ListView articlesList=(ListView)findViewById(R.id.articlesList);
             articlesList.setAdapter(articlesAdapter);
            //ActusScreen.titleIndex=0;
             ArticlesAdapter.mode = true;
             titleIndex=0;

             new GetAllArticlesTask().execute();

             header_text.setText(getResources().getText(R.string.actus).toString());

            MODE=NONE;

            break;
        case SEARCH:
            searchLayout.setVisibility(View.GONE);
            back.setVisibility(View.GONE);
            theme.setVisibility(View.VISIBLE);

            MODE=NONE;

            copyArticles();
            articlesAdapter.notifyDataSetChanged();
            break;
        case THEME_TO_SEARCH:
            searchLayout.setVisibility(View.GONE);
            MODE=THEME;
            copyArticles();
            articlesAdapter.notifyDataSetChanged();
            break;
        }
    }

    private void copyArticles() {
        if(articles!=null){
            if(articlesFiltered==null)
                articlesFiltered=new ArrayList<Article>();
            else
                articlesFiltered.clear();
            for(Article a: articles)
                articlesFiltered.add(a);
            }
        }


    public void filterArticles(){

        String key=searchField.getText().toString().toLowerCase();
        if(key.length()>0){

            if(articlesFiltered!=null){
                articlesFiltered.clear();
                System.gc();
            }

            for(Article a: articles){
                if(a.name.toLowerCase().contains(key))
                    articlesFiltered.add(a);
            }

            articlesAdapter.notifyDataSetChanged();
        }
    }

    private class GetAllArticlesTask extends AsyncTask<Void, Void, Void> {

        @Override
        public Void doInBackground(Void... params) {
            if(Globals.themes==null)
                Globals.themes=HTTPFunctions.getThemesList();

            if(articles!=null){
                articles.clear();
                System.gc();
            }

            articles=HTTPFunctions.getAllArticles();
            copyArticles();
            return null;
        }

        @Override
        public void onPreExecute() {
            pd = ProgressDialog.show(context, "", context.getResources().getString(R.string.loading), true, false);
        }

        @Override
        public void onPostExecute(Void result) {
            pd.dismiss();
            articlesAdapter.notifyDataSetChanged();
            themeAdapter.notifyDataSetChanged();
        }
     }

    private class GetThemeArticlesTask extends AsyncTask<String, Void, Void> {

        @Override
        public Void doInBackground(String... params) {
            if(articles!=null){
                articles.clear();
                System.gc();

            }

            articles=HTTPFunctions.getThemeArticles(params[0]);

            //begin 06/03; articles.theme_id not set by HTTPFunctions when a specific theme is selected; need to set it explicitly
            for (Article a : articles)
                a.theme_id=params[0];
            //end
            System.out.println("theme article: "+ HTTPFunctions.getThemeArticles(params[0]));
            copyArticles();

            return null;


        }


        @Override
        public void onPreExecute() {
            pd = ProgressDialog.show(context, "", context.getResources().getString(R.string.loading), true, false);
        }

        @Override
        public void onPostExecute(Void result) {
            pd.dismiss();
            articlesAdapter.notifyDataSetChanged();
        }
     }

    private class GetMoreArticlesTask extends AsyncTask<Void, Void, Void> {

        @Override
        public Void doInBackground(Void... params) {


            ArrayList<Article>moreArticles=HTTPFunctions.getMoreArticles(addOne((articlesFiltered.size()/15)));         

            if(moreArticles!=null){
                articles.addAll(articles);
                copyArticles();
            }

            return null;
        }

        @Override
        public void onPreExecute() {
            pd = ProgressDialog.show(context, "", context.getResources().getString(R.string.loading), true, false);
        }

        @Override
        public void onPostExecute(Void result) {
            pd.dismiss();
            articlesAdapter.notifyDataSetChanged();
        }
     }

    public void articleSelected(int id){
        Globals.copyArticles(articlesFiltered);
        Intent i=new Intent(context, SelectedArticle.class);
        i.putExtra("id", id);
        //begin
        //i.putExtra("title", ArticlesAdapter.selected);

        if (titleIndex==0){

            String title=Util.getTitleName(articlesFiltered.get(id).type, articlesFiltered.get(id).theme_id);
            i.putExtra("title", title); 
        }
        else{

            String title=ArticlesAdapter.selected.toUpperCase();
            i.putExtra("title", title); 
        }

        //end
        context.startActivity(i);
    }

    public void themeSelected(int id){
        themesList.setVisibility(View.GONE);
        MODE=THEME;
        theme.setVisibility(View.GONE);
        back.setVisibility(View.VISIBLE);
        ArticlesAdapter.mode = false;

        //begin 06/03
        //ArticlesAdapter.selected=Globals.themes.get(id).name;
        //header_text.setText(Globals.themes.get(id).name.toUpperCase());

        Spanned name=Html.fromHtml(Globals.themes.get(id).name);

        System.out.println("spanned name: "+ name);

        ArticlesAdapter.selected=name.toString().toUpperCase();
        header_text.setText(name.toString().toUpperCase());
        //end

        System.out.println("theme_name: "+ Globals.themes.get(id).name);
        new GetThemeArticlesTask().execute(Globals.themes.get(id).id);
    }

    public void loadMore(){
        new GetMoreArticlesTask().execute();
    }


    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
          if (original_view==true){

                new GetAllArticlesTask().execute();
                theme.setVisibility(View.VISIBLE);
                back.setVisibility(View.GONE);
                header_text.setText(getResources().getText(R.string.actus).toString());
                original_view=false;
          }

          super.onResume();
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub

        SelectedReglementation.setview=true;

        super.onPause();

    }


     class backTask extends AsyncTask<String, Void, ArrayList<Post>> {

          @Override
        protected void onPreExecute() {
        // TODO Auto-generated method stub

              super.onPreExecute();
        }
          @Override
            protected ArrayList<Post> doInBackground(String... urls) {

              ArrayList<Post> newpostarraylist=new ArrayList<Post>();

              try{

                     URL url = new URL("");
                        BufferedReader reader = null;
                        builder = new StringBuilder();
                        try {
                            reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
                            for (String line; (line = reader.readLine()) != null;) {
                                builder.append(line.trim());
                            }
                        } finally {
                            if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
                        }

                        System.out.println("Builder: "+ builder);

                        }catch(Exception ex){}

                return newpostarraylist;
            }

          @Override
            protected void onPostExecute(ArrayList<Post> result) {

                        String[] banner_image = builder.toString().split(";");
                        imageLoader.displayImage(banner_image[2], image_actus,options);
                        link = banner_image[1];

                }
            }



     public int addOne(int i){
            return i+1;
        }


}

和我的文章适配器

public class ArticlesAdapter extends BaseAdapter {

    ActusScreen main;
    ImageLoader imageLoader;
    String imageUrl="";
    public static String selected="";
    public static boolean mode=false;
    int x=0;

    //disable a.theme_id null pointer wh
    public static int bine=0;

    public ArticlesAdapter(ActusScreen m) {
        main=m;
        imageLoader=new ImageLoader(m);
    }

    public int getCount() {
        if(main.articlesFiltered!=null)
            return main.articlesFiltered.size();
        return 0;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

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

        final ViewHolder holder;
        if (convertView==null) {
            convertView=newView(position, parent);
            holder = new ViewHolder();
            holder.image=(ImageView)convertView.findViewById(R.id.image);
            holder.remove=(ImageView)convertView.findViewById(R.id.remove);
            holder.title=(TextView)convertView.findViewById(R.id.title);
            holder.text_title=(TextView)convertView.findViewById(R.id.text_title);
            holder.more=(RelativeLayout)convertView.findViewById(R.id.moreLayout);
            convertView.setTag(holder);

        } else {

            holder = (ViewHolder) convertView.getTag();
        }

        Article a=main.articlesFiltered.get(position);

        imageLoader.DisplayImage(String.format(imageUrl, a.image), holder.image);


        String str = a.name;

        int length = str.length();

        String newStr = a.name;

        if (length>65)
            newStr = str.replaceAll("^(.{74})(.*)$","$1...");

        holder.title.setText(Html.fromHtml(newStr));

        holder.text_title.setText(selected.toUpperCase());
        holder.remove.setVisibility(View.GONE);


        if (holder.text_title.equals(null))
            holder.text_title.setText("t");

        if(position==main.articlesFiltered.size()-1 && main.articlesFiltered.size()<=45  && main.articlesFiltered.size()%15==0)
            holder.more.setVisibility(View.VISIBLE);
        else
            holder.more.setVisibility(View.GONE);


        convertView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                main.articleSelected(position);
                SelectedArticle.mtypo=1;
            }

        });

        holder.more.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                main.loadMore();
            }
        });


        if (ActusScreen.titleIndex==0){
        ...

         }

        }

        return(convertView);
    }

    private View newView(int position, ViewGroup parent) {
        return(main.getLayoutInflater().inflate(R.layout.articles_row, parent, false));
    }

    class ViewHolder {
        ImageView image, remove;
        TextView title;
        TextView text_title;
        RelativeLayout more;
    }
}

UPDATE 和HttpFunction getMoreArticles()

public static ArrayList<Article> getMoreArticles(int page){
        String url=LAST_ARTICLE_URL;
        if(url.endsWith(".php"))
            url+="?page="+page;
        else
            url+="&page="+page;
        String response=getResponse(url);
        if(!ERROR.equals(response)){
            return JsonParsingFunctions.parseArticles(response);
        }
        return null;
    }

2 个答案:

答案 0 :(得分:1)

正在发生的是方法调用中的连接。 articlesFiltered.size()/ 15给出1,然后+1不是ADDING 1,它是连接1,即1 + 1 = 11 NOT 2.你可以创建一个方法

public int addOne(int i){
    return i+1;
}

并使用

ArrayList<Article>moreArticles=HTTPFunctions.getMoreArticles(addOne((articlesFiltered.size()/15)));

这应该可以提供其余的代码是好的

答案 1 :(得分:0)

你的适配器是什么变量?

您通知您的适配器,但我没有看到您向articlesAdapter添加数据