2017-02-14 31 views
-1

我對產品目錄有CustomGrid。網格的數據存儲在本地。文本來自本地JSON文件,圖像也存儲在res下。Android - Gridview表現瘋狂

顯示GridView時,300個項目未正確排列。他們在20次參賽後重復,當我上下滾動時他們混在一起。

我調試了數據數組,但它們看起來很好。我現在也對每個項目都有相同的圖像路徑。所以每個Gridview項目都有相同的圖像。但那是沒有不同的GridView行爲。

我對其他Gridviews沒有問題,只有更少的項目。我讀了關於延遲加載,但我沒有下載圖像文件

爲什麼網格的行爲如此?這是否太多過載?我怎麼解決這個問題?

編輯:

CustomGrid:

public class CustomGrid extends BaseAdapter{ 
private Context mContext; 
private final String[] gridItemText; 
private final int[] imageID; 

public CustomGrid(Context c, String[] gridItemText, int[] imageID){ 
    mContext = c; 
    this.gridItemText = gridItemText; 
    this.imageID = imageID; 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return gridItemText.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View grid; 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (convertView == null) { 

     //grid = new View(mContext); 
     grid = inflater.inflate(R.layout.grid_single_main, null); 
     TextView textView = (TextView) grid.findViewById(R.id.grid_single_text); 
     ImageView imageView = (ImageView)grid.findViewById(R.id.grid_single_image); 
     textView.setText(gridItemText[position]); 
     imageView.setImageResource(imageID[position]); 
    } else { 
     grid = (View) convertView; 
    } 

    return grid; 
} 

} 

活動:

CustomGrid adapter = new CustomGrid(ProductCatalogActivity.this, menuData, imagePath); 
    gridView1=(GridView)findViewById(R.id.grid_Main); 
    gridView1.setAdapter(adapter); 
    gridView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      //ToDo 
    } 
}); 
+3

請問您可以添加一些代碼 – raktale

+0

我加了相關代碼 – Mike

回答

1

到位您Viewholder機制試試這個

TextView textView; 
    ImageView imageView; 

    if (convertView == null) { 

     //grid = new View(mContext); 
     convertView = inflater.inflate(R.layout.grid_single_main, null); 
     textView = (TextView) convertView.findViewById(R.id.grid_single_text); 
     imageView = (ImageView) convertView.findViewById(R.id.grid_single_image); 
     convertView.setTag(new ViewHolder(textView, imageView)); 
    } else { 

     ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 
     textView = viewHolder.textView; 
     imageView = viewHolder.imageView; 

    } 

    textView.setText(gridItemText[position]); 
    imageView.setImageResource(imageID[position]); 
return convertView; 

也用這個viewholder

private static class ViewHolder { 

     public final TextView textView; 
     public final ImageView imageView; 

     public ViewHolder(TextView textView, ImageView imageView) { 
      this.textView = textView; 
      this.imageView = imageView; 
     } 
    } 
+0

謝謝。這工作。但爲什麼? – Mike

+0

那麼我的猜測是,你使用的視圖持有人沒有正確處理對象,例如沒有對象引用保留機制,如setTag()或等價物,因此對象的狀態可能會因此而改變。 – raktale