使用AsyncTask在列表视图中保留正确的值项

时间:2014-10-10 13:52:47

标签: android listview android-asynctask picasso

我是一个使用Android的新手,当我尝试显示图像列表以及每个图像的按钮时,我遇到了问题。按下按钮时的事件是显示图像的URL。因此,当我在屏幕上滚动时,显示的新图像在按下按钮时会有不同的URL。这些值与在屏幕上滚动之前显示的第一个图像相匹配。

我的主要代码如下:

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);
    }
}

在列表视图中显示新图像时,如何避免丢失新数据,我该怎么办?

先谢谢你。

2 个答案:

答案 0 :(得分:0)

您可以将位置添加为按钮的标记,然后在onClickListener中读取它:

viewHolder.buttonHolder.setTag(posicion);
viewHolder.buttonHolder.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                CopiarImagenListado((Integer)v.getTag());
                Toast.makeText(mContext, "Imagen copiada", Toast.LENGTH_SHORT).show();
            }
        });

答案 1 :(得分:0)

你可以试试这个:

// 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);
    v.setTag(viewHolder);
}
else
{
    viewHolder = (ViewHolder)v.getTag();
}

viewHolder.buttonHolder.setOnClickListener(new OnClickListener()
{
    @Override
    public void onClick(View v) {
        CopiarImagenListado(posicion);
        Toast.makeText(mContext, "Imagen copiada", Toast.LENGTH_SHORT).show();
    }
});

即使视图已被回收,您也必须重新定义onClick,因为posicion已经参与其中。