ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-视图持有人稳定性问题

2019-10-28 14:27:10  阅读:150  来源: 互联网

标签:android-viewholder listview android


我正在将数据上传到服务器,并且如果数据成功上传到服务器,那么我会显示“已保存”,就像您可以看到图像的“已上传”一样.

但是问题是,我已经为第一行存储了数据,而在不同的行项目中获取了“已保存”文本

holder.textDataStatus.setText(ImageList.get(position).getData());

protected void onPostExecute(String file_url) {
  // dismiss the dialog once product deleted
  pDialog.dismiss();

  try {

       // Prepare Save Data
       if(strStatusId.equals("0"))
       {
              Toast.makeText(UploadImagesActivity.this, "Unable to upload", Toast.LENGTH_SHORT).show();
                }
                else if (strStatusId.equals("1"))
                {
                    Toast.makeText(UploadImagesActivity.this, "Data Uploaded Successfully", Toast.LENGTH_SHORT).show();
                    ImageList.get(position).setData("Saved");               
                    Log.d("strData:", fileName); // getting correct tapped item
                    mAdapter.notifyDataSetChanged();
                }
                else
                {
                    Toast.makeText(UploadImagesActivity.this, "Unable to upload", Toast.LENGTH_SHORT).show();
                }

                } catch (Exception e) {
                    // TODO: handle exception
                }


           if (file_url != null){
                Toast.makeText(UploadImagesActivity.this, file_url, Toast.LENGTH_LONG).show();
           }

解决方法:

问题是您的适配器不知道该行的数据已上载到服务器.您需要告诉适配器.至于问题“如何告诉适配器?”,您已经有一个列表ImageList.我们只需要编辑它.

现在,向您的MyData类添加另一个布尔值,例如:boolean Uploaded = false;并为其创建getter setter.

将以下行添加到您的getView()中:

if(ImageList.get(position).isUploaded()){
    holder.btnUpload.setText("Save");
}else{
    holder.btnUpload.setText("Upload");
}

现在,我们需要在上传完成后将此值设置为true.我们应该只从UploadData类中执行此操作.为此,我们需要将位置发送到UploadData类.我们可以通过如下构造函数来做到这一点:

class UploadData extends AsyncTask<String, String, String> {
    private ProgressDialog pDialog;

    int position;

    //constructor to pass position of row, on which button was clicked to class
    public UploadData(int position){
        this.position=position;
    }

     /**
    * Before starting background thread Show Progress Dialog
    * */

    .
    .
    .
    .

   protected void onPostExecute(String file_url) {
       // dismiss the dialog once product deleted
       pDialog.dismiss();

       //after upload is done, set value to true
       ImageList.get(position).setUploaded(true);
       //now we need to notify our adapter so that it can reflect changes
       mAdapter.notifyDataSetChanged();
    .
    .

现在,根据您当前的代码,我认为通过构造函数将位置值传递给UploadData确实很困难.因此,您可以通过在类的全局变量中设置一个值来尝试.

编辑1:

将位置传递给您的holder.btnData.SetOnClickListener中的全局变量,如下所示:

holder.btnData.setOnClickListener(new OnClickListener() {

            @SuppressWarnings("deprecation")
            @Override
            public void onClick(View v) {
                //pass position into activity's global variable
                pos = position/*position from adapter*/;
                strPath = ImageList.get(position).getImages().toString();
                fileName = strPath.substring(strPath.lastIndexOf('/') + 1, strPath.length());                                      

                showDialog(DIALOG_DATA);

            }
        });

如果您需要任何解释,请发表评论.

标签:android-viewholder,listview,android
来源: https://codeday.me/bug/20191028/1952966.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有