2016-04-30 11 views
0

私は、ユーザが動的に設定できるarrayadapterを持つリストビュー付きのアプリケーションを作成しました。私は設定にjson文字列として入力された情報を格納し、私はアプリを更新するとき、私はエントリを持つリストを取得します。ネットワーク操作後に各エントリの横のイメージを変更する必要があります。私が直面している問題は、リスト内の要素が動的に追加されているため、onPostExecute()メソッドでイメージビューを更新するのも良い方法も見つからないようです。それらは同じレイアウト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のこの参照の助けを借りて画像を更新することができます。

私は、アダプタ上のパブリック変数を作成し、私はすべての画像を追加している:私は遅れて実行可能に展開onCreateView方法私の断片化の活動に続いて

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

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

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

(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

関連する問題