1

我想學習android sqlite,所以我創建了一個即時標記應用程序,用戶可以在其中標記他的照片並將其上傳到他的網絡(google +,fb,twitter)問題是我有一個ListFragment其中用戶可以看到他所做的所有標記,列表中的圖像元素存儲在一個隱藏的文件夾和單詞存儲在一個sqlite數據庫..問題是滾動向上或向下一些項目只是隨機切換,即使我有更多比8個項目多8個第一項顯示重複(即1-8而不是9-12我再次看到1-4) 唯一的問題可能是在適配器,但在調試會話的會話後,我無法找到問題我的適配器代碼是 -listfragment中的奇怪錯誤

public class FlowAdapter extends BaseAdapter { 

    private Activity activity; 
    private ArrayList<HashMap<String, List<String>>> data; 
    private static LayoutInflater layoutInflater = null; 

    public FlowAdapter(Activity activityContext, 
      ArrayList<HashMap<String, List<String>>> data) { 
     this.activity = activityContext; 
     this.data = data; 
     this.layoutInflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return data.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // method variables 
     ViewHolder cacheView; 
     HashMap<String, List<String>> photos = null; 
     photos = data.get(position); 
     ImageView iv; 
     FlowLayout flow; 

     ArrayList<String> subjects = new ArrayList<String>(); 

     if (convertView == null) { 
      cacheView = new ViewHolder(); 
      convertView = layoutInflater.inflate(R.layout.list_item, null); 
      flow = (FlowLayout) convertView.findViewById(R.id.flow_tags);; 

      // add the tags to the flowlayout 
      int size = photos.get(DatabaseHandler.KEY_TAGS).size(); 
      for (int i = 0; i < size; i++) { 
       String name = String.format("#%s", 
         photos.get(DatabaseHandler.KEY_TAGS).get(i)); 
       Bubble.getBubble(name, flow, subjects, activity, photos 
         .get(DatabaseHandler.KEY_THUMBNAILPATH).get(1), false); 
      } 
      cacheView.image = (ImageView)convertView.findViewById(R.id.list_image);//iv; 
      cacheView.tags = flow; 
      convertView.setTag(cacheView); 

     } 

     cacheView = (ViewHolder) convertView.getTag(); 
     cacheView.image.setImageBitmap(null); 
     DecodeTask task = new DecodeTask(cacheView.image); 
     task.execute(photos.get(DatabaseHandler.KEY_THUMBNAILPATH).get(1)); 
     cacheView.image.setTag(R.id.list_image, task); 

     return convertView; 
    } 

    static class ViewHolder { 
     static FlowLayout tags; 
     static ImageView image; 

     public static FlowLayout getFlowLayout() { 
      return tags; 
     } 
    } 
} 

的流佈局是從這裏開始 - http://nishantvnair.wordpress.com/2010/09/28/flowlayout-in-android/ 泡沫佈局就是從這裏開始 - http://nishantvnair.wordpress.com/2010/09/28/android-create-bubble-like-facebook/ 我用這個SO線程至後臺加載圖像 - Large ListView containing images in Android 任何幫助嗎? = \ p.s 我知道已經有這樣的應用程序[但實際上,但最好的學習來編寫代碼,因此我做了=]]

+0

如何放置此行** cacheView =(ViewHolder)convertView.getTag(); **在else條件內?不知道它是否會有幫助,但你可以試試看? –

+0

仍然沒有效果...我懷疑它有某種方式連接到flowlayout或bubbleview,因爲它們是動態的(換句話說,沒有id附加到泡泡佈局我只是將它們添加到運行時的flowlayout看看他們在我添加的鏈接上的實施) – crazyPixel

回答

4

原因是顯而易見的!!!你有靜態變量在ViewHolder

相反的:

static class ViewHolder { 
    static FlowLayout tags; 
    static ImageView image; 

    public static FlowLayout getFlowLayout() { 
     return tags; 
    } 
} 

必須是:

static class ViewHolder { 
    FlowLayout tags; 
    ImageView image; 

    public FlowLayout getFlowLayout() { 
     return tags; 
    } 
} 

更多關於static變量可用互聯網上,總之他們不是實例變量所以改變它的值會改變它的每個實例(雖然static變量應該使用類引用來訪問)。

UPDATE:

您還需要取消DecodeTask如果convertView是null作爲教程說:Large ListView containing images in Android

但保持這些變量static是簡單的錯誤,容易察覺,你可以檢測2+2 = 5中的錯誤。說刪除static修飾符似乎打破了一切意味着你的代碼有其他錯誤。

+0

不工作......它甚至變得更糟.. = \ 在使用靜態之前,有一個elemtn在整個列表「行爲不端」,有些只是沒有出現,現在有甚至沒有一個圖像在其正確的位置(旁邊的相關說明)... – crazyPixel

+0

「更糟糕」並不一定意味着你做錯了什麼。這清楚地表明照片加載代碼在某些地方是錯誤的。由於使變量靜態似乎工作。在第二次看來,我能夠確定你沒有取消''DecodeTask'',就像'getView()'中的'else'中的教程所建議的那樣。我會盡快更新答案,以便更清楚地指出問題。 –