2014-10-10 56 views
0

我是一个新手使用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); 
    } 
} 

我有什么在列表视图中显示新图像时不失去新的数据呢?

谢谢您的高级。

回答

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

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(); 
      } 
     }); 
+0

就是这样。为什么使用setTag在listview中分配项目的位置是一个不错的选择?我的意思是,程序如何知道什么位置需要在Asposeask类的后续解决中解决? – Levimatt 2014-10-10 14:09:25

+0

因此,当您滚动按钮时,始终知道与列表中的哪个项目关联。否则,在您使用不匹配的图片网址之前,您会采用这种方式。 – brwngrldev 2014-10-10 14:17:11

+0

有了这段代码,有些时候,当我按下图片的按钮时,url是错误的。其他时间的值是正确的,但随机地,当我在屏幕上滚动时,我得到一个错误的网址。 – Levimatt 2014-10-10 14:18:34