2016-01-12 3 views
0

Я попытался скопировать код других людей слово в слово, но я не могу заставить мой GridView отображать что-либо помимо белой страницы. getCount() вызывается и возвращает правильный номер, однако getView() не вызывается. Любые идеи очень приветствуются.Адаптер Gridview не вызывает getView(), хотя getCount() называется

public class drinkSaleList extends Activity { 

private ArrayList<String> drinkPhotoPaths = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_drink_sale_list); 

    GridView gridview = (GridView) findViewById(R.id.gridview); 

    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    int drinkCount = sharedPref.getInt("Drink", 0); 

    if(drinkCount > 0) 
    { 
     for(int i = 1; i <= drinkCount; i++){ 
      String path = getExternalFilesDir(null) + "/drinkObject" + i + ".ser"; 

      drinkPhotoPaths.add(path); 
     } 
    } 

    gridview.setAdapter(new drinkSaleLayoutAdapter(this, drinkPhotoPaths)); 

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 

      //Create an Intent to start the ImageViewActivity 
      Intent intent = new Intent(drinkSaleList.this, 
        SaleActivity.class); 
      Toast.makeText(drinkSaleList.this, "You clicked " + position + "and Id is " + id, Toast.LENGTH_SHORT).show(); 
      // Add the ID of the thumbnail to display as an Intent Extra 
      // intent.putExtra(EXTRA_RES_ID, (int) id); 

      // Start the ImageViewActivity 
      // startActivity(intent); 
     } 
    }); 

} 
public class drinkSaleLayoutAdapter extends BaseAdapter { 

    private Context mContext; 
    private List<String> mPhotoPaths; 


    public drinkSaleLayoutAdapter(Context c, List<String> photoPaths){ 

     mContext = c; 
     mPhotoPaths = photoPaths; 
    } 

    public int getCount(){ 
     int x = mPhotoPaths.size(); 
     return mPhotoPaths.size(); 

    } 

    public Object getItem(int position){ 

     return mPhotoPaths.get(position); 
    } 

    public long getItemId(int position){ 

     return position; 
    } 
    public View getView(int position, View convertView, ViewGroup parent){ 

     ImageView imageView; 

     if(convertView == null){ 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(100, 100)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8,8,8,8); 

     } 
     else{ 
      imageView = (ImageView) convertView; 
     } 

     FileInputStream fis = null; 
     try { 
      fis = new FileInputStream(mPhotoPaths.get(position)); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

     Bitmap bm = BitmapFactory.decodeStream(fis); 
     imageView.setImageBitmap(bm); 

     return imageView; 
    } 
} 

}

+0

Я могу понять, что идея есть, но я сделал это в прошлом, в соответствии с как Google сделал это с помощью SimpleAdapter, где getView() возвращает args и mResource, затем создайте список с помощью вида (ов), используя createViewFromResource(), где он будет возвращен и отображен. То, что я знаю, работает. Как вы это делаете, idk. Возможно, все дороги ведут в Рим. – CmosBattery

+0

Я считаю, что разница между кодом Google и моим кодом заключается в том, что вы не можете добавлять изображения в папку ресурсов во время выполнения. Поскольку моя программа получает снимки с помощью камеры * i.e. во время выполнения) и должен сохранять их в будущем, я считаю, что этот метод не является для меня вариантом, или это так будет хакерским. Надеюсь, я не ошибаюсь. –

+0

Его просто метод с именем. переменные, изображения с камеры, курсоры будут работать там. Поскольку оба имеют представления args, хотя метод getView() должен теоретически работать. – CmosBattery

ответ

0

код, кажется, исправить, за исключением одной пропавшей линии, которая является очень важным. В вашей функции getView() в else условии вы назначаете convertView экземпляру imageView, но фактически convertView не завышен или не инициализирован.

Вы должны изменить свой код, как показано ниже:

if(convertView == null){ 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(100, 100)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8,8,8,8); 
      convertView = imageView; 
     } 
     else{ 
      imageView = (ImageView) convertView; 
     } 

Я надеюсь, что, изменив свой код, он должен работать.

0

Вы не установили convertView, поэтому он получает значение null. сначала вы должны установить convertView. Вы должны попробовать это ..

public View getView(int position, View convertView, ViewGroup parent){ 
     ViewHolder viewHolder; 


      if(convertView == null){ 
LayoutInflater inflater = mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
convertView = inflater.inflate(R.layout.your_view, null); // you need one xml file which has parent layout to hold imageview 
viewHolder = new ViewHolder; 
viewHolder.linearLayout = converView.findViewById(R.id.linearLayout); //your parent layout id which is defined in xml file 
       viewHolder.imageView = new ImageView(mContext); 
       viewHolder.imageView.setLayoutParams(new GridView.LayoutParams(100, 100)); 
       viewHolder.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
       viewHolder.imageView.setPadding(8,8,8,8); 
    viewHolder.linearLayout.addView(viewHolder.imageView); // add imageview on layout 
convertView.setTag(viewHolder); 
      } 
      else{ 
       viewHolder = (ViewHolder) convertView.getTag(); 
      } 

      FileInputStream fis = null; 
      try { 
       fis = new FileInputStream(mPhotoPaths.get(position)); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 

      Bitmap bm = BitmapFactory.decodeStream(fis); 
      viewHolder.imageView.setImageBitmap(bm); 

      return convertView; 
     } 

private static class ViewHolder 
{ 
    LinearLayout linearLayout; 
    ImageView imageView; 
} 

это XML-файл

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"' 
    android:id="@+id/linearLayout"" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

</LinearLayout> 

надеюсь, это поможет вам

+0

Спасибо за ответ. Я пытаюсь реализовать этот код сейчас (работая над некоторыми ошибками, которые он дает/xml). Тем не менее, я хотел просто добавить, что я установил точку останова в первой строке в getView, которая никогда не срабатывает. Должна ли быть вызвана, по крайней мере, первая строка getView() для работы этого решения? –

+0

вы должны определить один файл 'xml', см. Отредактированный код. и комментарии в методах 'getView()'. Вы должны прочитать это [link] (http://stackoverflow.com/questions/11945563/how-listviews-recycling-mechanism-works). надеюсь, что это очистит понятия о 'convertview' –