2013-05-03 4 views
0

Я поставил лимит из 15 записей, которые будут отображаться в моем списке. 15 записей успешно отображены, но когда я нажал кнопку загрузки больше, он добавит предыдущие 15 записей и новые записи. Вот моя асинхронная задача, в которой добавлено больше записей. Я использую articlesAdapter.notifyDataSetChanged(); но проблема остается. Я считаю, что это имеет какое-то отношение к статьямFiltered.size()/15) +1.Update ListView Record Дублированный Android

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; 
    } 
+0

вы смысл делать articles.addAll (статьи); Разве это не просто дублирование статей уже в массиве? – o0rebelious0o

+0

да, он дублирует статьи уже в arraylist, но я хочу отображать их часть и отображать новые данные каждый раз, когда нажимается больше. – Dimitri

+0

Так вы можете уточнить, что вы делаете? Сначала вы заполняете список своими 15-ю статьями, и это все. Затем вы можете нажать загрузить больше, а еще 15 загрузятся с сервера? Почему вы дублируете начальные 15 статей в массиве? Не очень эффективна память? Использование памяти будет экспоненциальным с нагрузками ... Итак, после нажатия loadmore один раз у вас теперь есть 45 статей в arraylist (15 + 30) и что вы хотите сделать? Просто показать новые 15 в спискеView? Или у вас есть все 30, но установите представление, чтобы показывать последние 15? – o0rebelious0o

ответ

1

То, что происходит конкатенация в вызове метода. articlesFiltered.size()/15 дает 1, то +1 не ДОБАВЛЕНИЕ 1, она конкатенации 1, т.е. 1 + 1 = 11 НЕ 2. Вы можете создать метод

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

и использовать

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

это должно работать при условии остального кода хороший

+0

Я сделал это, если вы скажете, что еще дублируете предыдущие 15 записей – Dimitri

+0

можете ли вы добавить код для метода getMoreArticles к вопросу? Вероятно, вы сможете помочь с этим – o0rebelious0o

+0

вы имеете в виду весь код? класс ?заключается в том, что он – Dimitri

0

, что переменная является адаптер?

вы сообщаете адаптер, но я не вижу, что вы добавляете ДАННЫЕ вашему articlesAdapter

+0

проверить мой обновленный вопрос. Существует еще одна асинхронная задача, которая GetAllArticlesTask. затем, когда я нажимал на строку в адаптере, getmore async задается как – Dimitri

+0

, это очень удобно, когда вы делаете «articles.addAll (статьи)»; вы дублируете данные ... если у вас есть 15 предметов в статьях, и вы делаете «articles.addAll (articles)», у вас есть 15 предметов + те же 15 предметов. возможно ли это? – Bae

+0

вы можете быть более ясными – Dimitri