2015-05-18 5 views
0

У меня проблема с изображением gridView. Я помещал все изображения в массив, но когда отображается сетка, изображения не в том порядке, в котором я решил. Вот мой код, взятый из различных уроков.Изображения Android в gridView в неправильном порядке

Основная деятельность:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="Clicca sull'immagine per ingrandire" 
    android:id="@+id/textView2" 
    android:layout_gravity="center_horizontal" 
    android:textAlignment="center" 
    android:paddingBottom="10sp" 
    android:textColor="@color/white" 
    android:textSize="@dimen/text_size"/> 

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/grid_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:numColumns="auto_fit" 
    android:columnWidth="300dp" 
    android:horizontalSpacing="10dp" 
    android:verticalSpacing="10dp" 
    android:gravity="center" 
    android:stretchMode="columnWidth" > 
</GridView> 

Связанные Java-код:

package ...; 

import android.content.Intent; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.GridView; 

public class extends ActionBarActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_); 

    GridView gridView = (GridView) findViewById(R.id.grid_view); 

    // Instance of ImageAdapter Class 
    gridView.setAdapter(new ImageAdapter(this)); 

    /** 
    * On Click event for Single Gridview Item 
    * */ 
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 

      // Sending image id to FullScreenActivity 
      Intent i = new Intent(getApplicationContext(), FullImageActivity.class); 
      // passing array index 
      i.putExtra("id", position); 
      startActivity(i); 
     } 
    }); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

Изображение Adapter:

package com.example.valeria.Flexibilia_abbigliamento_per_danze_caraibiche_by_DDLAB; 
import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 

public class ImageAdapter extends BaseAdapter { 
    private Context mContext; 

// Keep all Images in array 
public Integer[] mThumbIds = { 
     R.drawable.max27a1ridotta, R.drawable.max27b1ridotta, 
     R.drawable.max27c1ridotta, R.drawable.max29a1ridotta, 
     R.drawable.max29b1ridotta, R.drawable.max30a1ridotta, 
     R.drawable.max30b1ridotta, R.drawable.max33a1ridotta, 
     R.drawable.max33b1ridotta, R.drawable.max36a1ridotta, 
     R.drawable.max38a1ridotta, R.drawable.max38b1ridotta, 
     R.drawable.max281ridotta, R.drawable.max311ridotta, 
     R.drawable.max321ridotta, R.drawable.max341ridotta, 
     R.drawable.max351ridotta, R.drawable.max371ridotta, 
     }; 

// Constructor 
public ImageAdapter(Context c) { 
    mContext = c; 
} 

@Override 
public int getCount() { 
    return mThumbIds.length; 
} 

@Override 
public Object getItem(int position) { 
    return mThumbIds[position]; 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
     imageView = new ImageView(mContext); 
     imageView.setImageResource(mThumbIds[position]); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
     imageView.setLayoutParams(new GridView.LayoutParams(350, 300)); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    return imageView; 
} 
} 

В gridView отображается правильное количество элементов, но изображения рандомизированы. Я новичок в андроиде и в программировании, и возможно, что, принимая примеры из разных источников, я добавляю слишком много кода. Где я ошибся?

Спасибо и извините за мой английский ...

ответ

3

Проблема не в том порядке, изображений, проблема заключается в том, как вы работаете с convertView. даже если он не является нулевым, вы должны его заполнить, иначе вы получите кешированный вид для другой позиции. Так что этот код должен решить проблему:

 if (convertView == null) { 
      imageView = new ImageView(mContext); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
      imageView.setLayoutParams(new GridView.LayoutParams(350, 300)); 
     } else { 
      imageView = (ImageView) convertView; 
     } 
     imageView.setImageResource(mThumbIds[position]); 
     return imageView; 

И только в будущем я хотел бы предложить вам прочитать о ViewHolder patern

+0

Хорошо, это работает! Я уже смотрел на viewHolder, но есть кое-что, чего я не понимаю ... я медленно. Спасибо! – Marcellino247

+0

@ Marcellino247, пожалуйста, как и для ViewHolder, это в основном хранилище, которое ссылается на Views (более удобно, когда дочерние представления имеют сложную иерархию и несколько видов, которые нужно настроить), поэтому вам не придется делать привязку еще раз (findViewById), вам просто нужно будет установить соответствующие данные для этих представлений. Кроме того, если ответ будет полезен, можете ли вы пометить его как правильно? – Chaosit

Смежные вопросы