在Android上的动态列表上动态更改图像

m33ts4k0z

我创建了一个带有带有arrayadapter的listview的应用程序,用户可以动态填充该应用程序。我将输入的信息作为json字符串存储在首选项中,并在刷新应用程序时获得包含条目的列表。问题是,我希望网络操作后每个条目旁边的图像发生变化。我面临的问题似乎是由于列表中的元素是动态添加的,因此我似乎没有找到一种好的方法来更新onPostExecute()方法上的imageview,也不能专门针对每个条目,因为它们共享相同的布局ID。

这是我的适配器内部的getView()方法:

   @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.product_list_item, null);
            holder = new ViewHolder();
            holder.deviceName = (TextView) convertView
                    .findViewById(R.id.txt_pc_name);
            holder.deviceIp = (TextView) convertView
                    .findViewById(R.id.txt_pdt_desc);
            holder.devicePort = (TextView) convertView
                    .findViewById(R.id.txt_pdt_price);
            holder.favoriteImg = (ImageView) convertView
                    .findViewById(R.id.imgbtn_favorite);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        Devices device = (Devices) getItem(position);
        holder.deviceName.setText(device.getName());
        holder.deviceIp.setText(device.getIpOnline());
        holder.devicePort.setText(device.getPortOnline() + "");              


        return convertView;
    }

这是我的AsyncTask:

public class Connection extends AsyncTask<String, Void, String> {

   private String ipOnline;
   private int portOnline;
   private String ipWol;
   private int portWol;
   private String macAddress;
   private ImageView img;
   private Context context;
    public interface AsyncResponse {
        void processFinish(String output);
    }



     public AsyncResponse delegate = null;

        public Connection(Context mContext, ImageView Img,String IpOnline, int PortOnline, String IpWol, int PortWol, String MacAddress, AsyncResponse delegate) {
            ipOnline = IpOnline;
            portOnline = PortOnline;
            ipWol = IpWol;
            portWol = PortWol;
            macAddress = MacAddress;
            context = mContext;
          //  inflate = Inflate;
            img = Img;
           // spin = spinner;
            this.delegate = delegate;
        }
        public int status;

        @Override
       protected String doInBackground(String... arg0) {PreferenceManager.getDefaultSharedPreferences(lastContext);
            try  {
                Socket echoSocket = new Socket();
                echoSocket.connect(new InetSocketAddress(ipOnline,portOnline),2000);

                if(echoSocket.isConnected())
                    status = 1;
            } catch (Exception e) {
                status = 0;
            }
            if(status == 0)
                return "0";
            else
                return "1";
       }

        @Override
        protected void onProgressUpdate(Void... values) {}

       @Override
       protected void onPostExecute(String result) {           
           super.onPostExecute(result);
ImageView img = (ImageView) activity.findViewById(R.id.imgbtn_favorite);
               if (status == 0)
                   img.setImageResource(android.R.drawable.presence_offline);
               else
                   img.setImageResource(android.R.drawable.presence_online);
    delegate.processFinish(result);  
       }   
    }

这是我的电话:

new Connection(activity, img, product.getIpOnline(), Integer.parseInt(product.getPortOnline()), product.getIpWol(), Integer.parseInt(product.getPortWol()), product.getMacAddress(), new Connection.AsyncResponse() {
                        @Override
                        public void processFinish(String output) {
                        }
                    }).execute();
m33ts4k0z

我想出了一个解决方案。

我在适配器上创建了一个公共变量,并添加了所有图像:

public List<ImageView> allImages = new ArrayList<ImageView>();

public List<ImageView> getAllImages(){
        return this.allImages;
    }

this.allImages.add((ImageView) convertView
                .findViewById(R.id.imgbtn_favorite));

然后在我的零散活动onCreateView方法上,我部署了一个延迟的可运行对象:

(new Handler()).postDelayed(new Runnable() {
                @Override
                public void run() {
                    updateStatus();
                }
            }, 500);

updateStatus()方法将初始化images变量,并开始网络检查以确定要使用的图像。然后将其相应地应用。

public void updateStatus() {
        List<ImageView> images = deviceListAdapter.getAllImages();
        if(count > 0 && images.size() > 0) {
            for (int i = 0; i < deviceListAdapter.getCount() ; i++) {
                Devices product = (Devices) deviceListAdapter.getItem(i);
                if((TextUtils.isDigitsOnly(product.getPortOnline()) && TextUtils.isDigitsOnly(product.getPortWol())) && (!product.getPortOnline().isEmpty() && !product.getPortWol().isEmpty()))  {
                    new Connection(activity, images.get(i), product.getIpOnline(), Integer.parseInt(product.getPortOnline()), product.getIpWol(), Integer.parseInt(product.getPortWol()), product.getMacAddress(), new Connection.AsyncResponse() {
                        @Override
                        public void processFinish(Boolean output) {
                        }
                    }).execute();
                }
            }
        }
    }

这可能不是最佳选择,但可以随时添加更好的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章