#android #android-sdcard #android-gridview
#Android #android-sdcard #android-просмотр сетки
Вопрос:
Я использую вид сетки с примером layout inflator.
Я выбираю изображение с SD-карты, и название изображения и текста извлекается из string.txt файл.
Когда я тестирую на эмуляторе (широкий экран), это работает нормально, но когда я проверяю это на эмуляторе с экраном, эквивалентным реальному устройству (разрешение: 240 x 320 QVGA), это сопровождается прокруткой, когда я перехожу к последней строке, первое изображение повторяется и в последней строке.
Мой файл string содержит
01.png;http://abc.com/01.png;Text1|02.png;http://abc.com/02.png;Text2|03.png;http://abc.com/03.png;Text3|04.png;http://abc.com/04.png;Text4|05.png;http://abc.com/05png;Text5|06.png;http://abc.com/06.png;Text6|07.png;http://abc.com/07.png;Text7|08.png;http://abc.com/08.png;Text8|09.png;http://abc.com/09.png;Text9|10.png;http://abc.com/10.png;Text10|11.png;http://abc.com/11.png;Text11|12.png;http://abc.com/12.png;Text12
Мой код выглядит следующим образом:
public View getView(final int position, View convertView, ViewGroup parent) {
View v=convertView;
//String text;
final ImageView picturesView;
String[] newtext = null;
if (convertView == null) {
LayoutInflater li = getLayoutInflater();
v = li.inflate(R.layout.icon, null);
//File sdcard = Environment.getExternalStorageDirectory();
File file = new File(path,"string.txt");
//StringBuilder stext = new StringBuilder();
TextView tv = (TextView)v.findViewById(R.id.icon_text);
String[] columns = null;
//String[] url = null;
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
columns = line.split("\|");
}
}
catch (IOException e) {
//You'll need to add proper error handling here
}
newtext=columns[position].split("\;");
tv.setText(newtext[2]);
tv.setTextSize(12);
tv.setTextColor(Color.BLACK);
mUrl = path "s/" newtext[0];
name=newtext[0];
url=newtext[1];
final Bitmap mBitmap = BitmapFactory.decodeFile(mUrl);
picturesView=(ImageView)v.findViewById(R.id.icon_image);
picturesView.setImageBitmap(mBitmap);
picturesView.setTag(R.id.icon_image,name);
picturesView.setTag(R.id.icon_text,url);
picturesView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
imgname=(String) v.getTag(R.id.icon_image);
imgurl=(String) v.getTag(R.id.icon_text);
// TODO Auto-generated method stub
String cimagename;
String oimagename;
String cUrl;
String oUrl;
if (selectedImage != null) {
oimagename=selectedImage;
oUrl = path "s/" oimagename;
Bitmap oBitmap = BitmapFactory.decodeFile(oUrl);
selectedView.setImageBitmap(oBitmap);
}
selectedImage = imgname;
selectedView = (ImageView) v;
cimagename=imgname;
cUrl = path "c/" cimagename;
Bitmap cBitmap = BitmapFactory.decodeFile(cUrl);
picturesView.setImageBitmap(cBitmap);
}
});
}
return v;
}
Я попытался вручную проверить значение name, т. Е. (от 01.png до 12.png) методом Toast.makeText, он отлично работает до 9 элементов (элементы доступны без прокрутки), он отображает 01.png до 09.png, но затем он снова отображает 01.png вместо 10.png затем отображает 11.png затем 12.png.
Я не могу понять, почему 01.png появляется дважды? Я полностью застрял на этом.
Ответ №1:
закройте инструкцию if
if (convertView == null) {
LayoutInflater li = getLayoutInflater();
v = li.inflate(R.layout.icon, null);
} //<--add this and remove the closing brace you currently have at the above the return v;
Ответ №2:
Вы могли бы попробовать это:
public View getView(int position, View convertView, ViewGroup parent) {
View MyView = convertView;
if (convertView == null) { // if it's not recycled, initialize some attributes
//Inflate the layout
LayoutInflater li = getLayoutInflater();
MyView = li.inflate(R.layout.grid_item, null);
} else {
MyView = convertView;
}
// Add The Image!!!
ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image);
iv.setImageResource(mThumbIds[position]);
// Add The Text!!!
TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text);
tv.setText(names[position] );
return MyView;
}