gpt4 book ai didi

android - ListView 滚动错误

转载 作者:行者123 更新时间:2023-11-30 00:30:17 25 4
gpt4 key购买 nike

我有一个自定义的 ListView,带有一个 ImageView、一个 TextView 和一个 CheckBox。这个问题对某些程序员来说似乎很古老,但我真的找不到确定的解决方案。我的问题是 ImageView。当我滚动时,图像会发生变化。

一些细节是:

  • 我没有使用RecyclerView
  • 为了保持 CheckBox 的状态,我使用了 getTagsetTag 方法。他们工作正常。
  • 我正在尝试实现一个文件浏览器。
  • 我为几乎所有文件类型(包括图像)提供了默认图像。
  • AsyncTask 中,我想加载图像和视频的缩略图,加载后将它们附加到相应的 ImageView。 ----> 这就是问题。

我无法保持 ImageView 的位置。即使滚动非图像 ImageView(即与图像或视频不对应)也会丢失其默认图像。

这是我在 ListAdapter 类中实现的 getView 代码:

    @Override
public View getView(final int position, View convertView, ViewGroup parent) {

File file=new File(String.valueOf(filenames[position]));
if(file.isDirectory()){
img=R.drawable.folder;
}

else{
img=getImage(filenames[position]);
}


ViewHolder viewHolder = null;

if (convertView == null) {
LayoutInflater inflator = LayoutInflater.from(getContext());
convertView = inflator.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.tv = (TextView) convertView.findViewById(R.id.textView1);
viewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox1);
viewHolder.iv= (ImageView)convertView.findViewById(imageView);
viewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
myList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
}
});
convertView.setTag(viewHolder);
convertView.setTag(R.id.textView1, viewHolder.tv);
convertView.setTag(R.id.checkBox1, viewHolder.cb);
convertView.setTag(R.id.checkBox1, viewHolder.iv);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}

viewHolder.iv.getLayoutParams().height = 80;
viewHolder.iv.getLayoutParams().width = 80;
viewHolder.cb.setTag(position);
final ViewHolder ViewHolder= viewHolder;

ViewHolder.tv.setText(myList.get(position).getName());
ViewHolder.cb.setChecked(myList.get(position).isSelected());
viewHolder.iv.setImageResource(img);


Log.v("this","viewHolderMT: "+String.valueOf(viewHolder)+" position: "+position);

final View finalConvertView = convertView;




myTask m=new myTask(position,viewHolder.iv);
m.execute();

return convertView;



}
class myTask extends AsyncTask<Integer,Bitmap,Bitmap>{



int pos;
ImageView iv;
public myTask(int pos,ImageView iv){
this.pos=pos;
this.iv=iv;
iv.setTag(pos);
//iv.setImageBitmap(null);

}

@Override
protected Bitmap doInBackground(Integer... params) {
Bitmap thumb=null;
//Log.v("this","position: "+String.valueOf(position));

if((String.valueOf(filenames[pos])).contains(".jpeg")||String.valueOf(filenames[pos]).contains(".jpg")||String.valueOf(filenames[pos]).contains(".png")||String.valueOf(filenames[pos]).contains(".bmp")||String.valueOf(filenames[pos]).contains(".webp")||String.valueOf(filenames[pos]).contains(".gif")){

thumb = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(String.valueOf(filenames[pos])), 64, 64);
//publishProgress(thumb);

//Log.v("this","viewHolderDIB: "+String.valueOf(viewHolder)+"position: "+position);
//Log.v("this","filenameDOI: "+String.valueOf(filenames[pos])+" positionDOI: "+String.valueOf(pos));
}
else if((String.valueOf(filenames[pos])).contains(".mp4")||String.valueOf(filenames[pos]).contains(".mkv")||String.valueOf(filenames[pos]).contains(".webm")||String.valueOf(filenames[pos]).contains(".3gp")||String.valueOf(filenames[pos]).contains(".3gpp")){
thumb=ThumbnailUtils.createVideoThumbnail(filenames[pos].getPath(), MediaStore.Video.Thumbnails.MINI_KIND);
// Log.v("this","viewHolderDIB: "+String.valueOf(viewHolder)+"position: "+position);
// publishProgress(thumb);

}
return thumb;
}
@Override
protected void onProgressUpdate(Bitmap... thumb){


}
@Override
protected void onPostExecute(Bitmap thumb){
/*if(isCancelled()){
return;
}
*/
if(thumb!=null && (Integer)iv.getTag()==this.pos) {
if ((String.valueOf(filenames[pos])).contains(".jpeg") || String.valueOf(filenames[pos]).contains(".jpg") || String.valueOf(filenames[pos]).contains(".png") || String.valueOf(filenames[pos]).contains(".bmp") || String.valueOf(filenames[pos]).contains(".webp") || String.valueOf(filenames[pos]).contains(".gif")) {
//Log.v("this","filenameOPE: "+String.valueOf(filenames[pos])+" positionOPE: "+String.valueOf(pos));
iv.setImageBitmap(thumb);
//iv.setTag(pos);
// Log.v("this", "In PU: " + String.valueOf(thumb));
}
//} else if ((String.valueOf(filenames[pos])).contains(".mp4") || String.valueOf(filenames[pos]).contains(".mkv") || String.valueOf(filenames[pos]).contains(".webm") || String.valueOf(filenames[pos]).contains(".3gp") || String.valueOf(filenames[pos]).contains(".3gpp")) {

// iv.setImageBitmap(thumb);
//}
//Log.v("this ", "Tag: " + String.valueOf(pos));

}





}
}

这里的 filenames 是一个 File array,包含通过主 Activity 传递到列表 adapter 类的文件列表。

附言如果你愿意,我也可以用主要 Activity 更新帖子。提前致谢。我是新手所以请合作。

最佳答案

尝试在你的适配器中添加这两个方法并检查

@Override
public int getViewTypeCount() {

return getCount();
}

@Override
public int getItemViewType(int position) {

return position;
}

关于android - ListView 滚动错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44524773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com