我是一个新手使用android和我正在面临一个问题,当我试图显示一个图像列表与每个图像的按钮一起。按下按钮时的事件是显示图像的URL。所以,当我在屏幕上滚动时,按下按钮时显示的新图像具有不同的网址。这些值与在滚动屏幕前显示的第一张图像相同。使用AsyncTask保存正确的值项目在列表视图
我的主要代码如下:
public class ImagenesAdapter extends BaseAdapter{
private Context mContext;
private Map<String,?> mListImagenes;
static class ViewHolder{
public Button buttonHolder;
public ImageView imageviewHolder;
int position;
}
public ImagenesAdapter(Context c, Map<String,?> list) {
mContext = c;
mListImagenes = list;
}
@Override
public int getCount() {
return mListImagenes.size();
}
@Override
public Object getItem(int position) {
return mListImagenes.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// reference to convertView
View v = convertView;
ViewHolder viewHolder=null;
final int posicion=position;
// inflate new layout if null
if(v == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
v = inflater.inflate(R.layout.activity_listado_imagenes_subidas, null);
//configure view holder
viewHolder = new ViewHolder();
viewHolder.buttonHolder = (Button)v.findViewById(R.id.btnCopiarImagenUrl);
viewHolder.imageviewHolder = (ImageView)v.findViewById(R.id.imagen);
viewHolder.buttonHolder.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
CopiarImagenListado(posicion);
Toast.makeText(mContext, "Imagen copiada", Toast.LENGTH_SHORT).show();
}
});
v.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder)v.getTag();
}
SharedPreferences prefsTH = mContext.getSharedPreferences("PrefsTH", ListadoImagenesSubidasMain.MODE_PRIVATE);
String cadenaURL="";
String sp = prefsTH.getString("urlTH"+position, "");
if (sp != "")
{
cadenaURL = sp;
if ((viewHolder.imageviewHolder != null) && (cadenaURL != "")){
viewHolder.position = position;
new DownloadAsyncTask(viewHolder, position).execute(cadenaURL);
}
}
return v;
}
private class DownloadAsyncTask extends AsyncTask<String, Void, String>{
private ProgressDialog dialog = new ProgressDialog(mContext);
private ViewHolder mHolder;
private int mPosition;
public DownloadAsyncTask(ViewHolder holder, int position){
this.mHolder = holder;
this.mPosition = position;
}
protected void onPreExecute(){
dialog.setMessage("Cargando imágenes...");
dialog.show();
}
@Override
protected String doInBackground(String... params) {
String url = params[0];
return url;
}
protected void onPostExecute(String result) {
if (dialog.isShowing()) {
dialog.dismiss();
}
if (result != null && mPosition == mHolder.position){
mHolder.buttonHolder.setText("Copiar");
Picasso.with(mContext)
.load(result)
.into(mHolder.imageviewHolder);
}
}
private void CopiarImagenListado(int position){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
String cadenaURL="";
String sp = prefs.getString("url"+position, "");
if (sp != "")
{
cadenaURL = sp;
ClipboardManager clipboard = (ClipboardManager)mContext.getSystemService(mContext.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Imagen copiada", sp);
clipboard.setPrimaryClip(clip);
}
}
我有什么在列表视图中显示新图像时不失去新的数据呢?
谢谢您的高级。
就是这样。为什么使用setTag在listview中分配项目的位置是一个不错的选择?我的意思是,程序如何知道什么位置需要在Asposeask类的后续解决中解决? – Levimatt 2014-10-10 14:09:25
因此,当您滚动按钮时,始终知道与列表中的哪个项目关联。否则,在您使用不匹配的图片网址之前,您会采用这种方式。 – brwngrldev 2014-10-10 14:17:11
有了这段代码,有些时候,当我按下图片的按钮时,url是错误的。其他时间的值是正确的,但随机地,当我在屏幕上滚动时,我得到一个错误的网址。 – Levimatt 2014-10-10 14:18:34