我是一个使用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);
}
}
在列表视图中显示新图像时,如何避免丢失新数据,我该怎么办?
先谢谢你。
答案 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
已经参与其中。