2016-04-30 88 views
0

我已經創建了一個包含arrayadapter的listview應用程序,用戶可以動態填充該應用程序。我將作爲json字符串輸入的信息存儲在首選項中,當我刷新應用程序時,我會得到包含條目的列表。問題是,我希望在網絡操作之後,每個條目旁邊的圖像都要更改。我正面臨的問題似乎是,因爲列表中的元素是動態添加的,所以我似乎找不到一個好方法來更新onPostExecute()方法上的imageview,以便能夠專門針對每個條目他們共享相同的佈局ID。在Android動態列表上動態更改圖像

這裏是我的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(); 

回答

0

ID,我想出了一個解決方案更新的圖像。

我創建了一個公共變量我的適配器上,我將所有的圖片:

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 ()方法初始化圖像變量並開始網絡檢查以確定要使用的圖像。然後它相應地應用它。

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

它可能不是最佳的,但隨時添加更好的解決方案。

0

你可以使用查看模式或回收查看器。

您需要存儲圖像鑑於持有人的參考,可以與該參考的幫助,而不是看

+0

感謝您的回答。我已經實現了一個視圖持有者模式,但問題是,當爲了執行網絡操作而調用我的Async類時,getView始終調用它,並且圖像需要一些時間才能刷新。我做錯了什麼?我附加了我的getView方法。 – m33ts4k0z

+0

只是發佈你的代碼片段的異步任務和它的電話 – Alok

+0

我已經更新了我的問題與所涉及的所有代碼 – m33ts4k0z