2016-12-17 4 views
5

Прошу прощения, если вопрос слишком длинный. Здесь мы идем:Волейбол работает на WIFI, но не на 3G

Существует два вида деятельности: Main и Detail Деятельность.

Main Activity в основном представляет собой GridView. Detail Activity в основном показывает информацию о деталях щелкнутого элемента. Я передаю идентификатор выбранного элемента (pid) с Main на Detail Деятельность.

Я столкнулся с проблемой следующим образом. Первоначально у меня есть соединение 3G (сотовая связь) и щелкнуто по первому элементу, и см. Соответствующую деталь в Detail Activity, он отлично работает и возвращается к Main Activity, а затем щелкнул по второму пункту, но, к сожалению, он все еще показывает мне первый элемент в DetailActivity, который я щелкнул поначалу.

Я переключился с 3g на wifi, когда приложение активно и открыто. Независимо от того, что я нажимаю, он по-прежнему показывает мне первый элемент, который я щелкнул поначалу.

Но когда я удаляю приложение и переустанавливаю его и получаю либо wifi доступ только, приложение работает отлично.

В следующей реализации URL-адрес подключения (PRODUCT_DETAIL_URL) равен http, а не https. Я использую библиотеку Volley для сетевого подключения.

DetailActivity.java

private void productDetailInit() { 
     // it is http 
     StringRequest postRequest = new StringRequest(Request.Method.POST, Config.PRODUCT_DETAIL_URL, 
       new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
          try { 
           jsonObject = response; 
           loadJsonData(); 
          } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         error.printStackTrace(); 
        } 
       } 
      ) { 
      @Override 
      protected Map<String, String> getParams() { 
       Map<String, String> params = new HashMap<>(); 
       params.put("id", productID); 
       return params; 
      } 
     }; 

     RetryPolicy policy = new DefaultRetryPolicy(1000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
     postRequest.setRetryPolicy(policy); 
     CustomVolleyRequest.getInstance(this).getRequestQueue().add(postRequest); 
    } 

CustomVolleyRequest.java

public class CustomVolleyRequest { 

private static CustomVolleyRequest customVolleyRequest; 
private static Context context; 
private RequestQueue requestQueue; 
private ImageLoader imageLoader; 

private CustomVolleyRequest(Context context) { 
    this.context = context; 
    this.requestQueue = getRequestQueue(); 

    imageLoader = new ImageLoader(requestQueue, 
      new ImageLoader.ImageCache() { 
       private final LruCache<String, Bitmap> 
         cache = new LruCache<String, Bitmap>(20); 

       @Override 
       public Bitmap getBitmap(String url) { 
        return cache.get(url); 
       } 

       @Override 
       public void putBitmap(String url, Bitmap bitmap) { 
        cache.put(url, bitmap); 
       } 
      }); 
} 

private class BitmapCache implements ImageLoader.ImageCache { 

    private LruCache<String, Bitmap> mCache; 

    public BitmapCache() { 
     mCache = new LruCache<>(20); 
    } 

    @Override 
    public Bitmap getBitmap(String url) { 
     return mCache.get(url); 
    } 

    @Override 
    public void putBitmap(String url, Bitmap bitmap) { 
     // scaling bitmap for avoiding too much big images 
     Bitmap scaled = ImageUtil.getInstance().scaleBitmap(bitmap); 
     mCache.put(url, scaled); 
    } 
} 

public static synchronized CustomVolleyRequest getInstance(Context context) { 
    if (customVolleyRequest == null) { 
     customVolleyRequest = new CustomVolleyRequest(context); 
    } 
    return customVolleyRequest; 
} 

public RequestQueue getRequestQueue() { 
    if (requestQueue == null) { 
     Cache cache = new DiskBasedCache(context.getCacheDir(), 10 * 1024 * 1024); 
     Network network = new BasicNetwork(new HurlStack()); 
     requestQueue = new RequestQueue(cache, network); 
     requestQueue.start(); 
    } 
    return requestQueue; 
} 

public ImageLoader getImageLoader() { 
    return imageLoader; 
} 

} 

Adapter.java

class ProductMainAdapter extends ArrayAdapter<ImageRecord> { 
    private ImageLoader mImageLoader; 
    private String jsonObject; 

    ProductMainAdapter(Context context) { 
     super(context, R.layout.grid_item); 
     mImageLoader = CustomVolleyRequest.getInstance(this.getContext()).getImageLoader(); 
    } 

    @NonNull 
    @Override 
    public View getView(final int position, View convertView, @NonNull ViewGroup parent) { 
     final ViewHolder holder; 
     if(convertView == null) { 
      holder = new ViewHolder(); 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.grid_item, parent, false); 
      convertView.setBackgroundResource(R.drawable.round_gridview); 
      holder.priceTagImage = (ImageView) convertView.findViewById(R.id.priceTag_IV); 
      holder.textView = (TextView) convertView.findViewById(R.id.text); 
      holder.imageView = (NetworkImageView) convertView.findViewById(R.id.picture); 
      holder.priceTagRL = (RelativeLayout) convertView.findViewById(R.id.priceTag_RL); 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     ImageRecord imageRecord = getItem(position); 
     holder.imageView.setImageUrl(imageRecord != null ? imageRecord.getUrl() : null, mImageLoader); 
     holder.imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       openProductDetail(position); 
      } 
     }); 
     holder.textView.setText(imageRecord != null ? imageRecord.getTitle() : null); 
     holder.priceTagRL.setRotation(0); 

     return convertView; 
    } 

    private class ViewHolder{ 
     TextView textView; 
     ImageView priceTagImage; 
     NetworkImageView imageView; 
     RelativeLayout priceTagRL; 
    } 

    private void openProductDetail(int position) { 
     try { 
      ImageRecord imr = getItem(position); 
      String productID = imr != null ? imr.getId() : "0"; 
      Intent intent = new Intent(getContext(), ProductDetailActivity.class); 
      intent.putExtra("pid", productID); 
      getContext().startActivity(intent);  
     } catch (Exception e) { 
      Log.e("openProductDetail", "exception", e); 
     } 
    } 

Интересно, что мне не хватает/неправа в предоставленной реализации. Прошло почти 2-3 месяца, я не мог справиться с этой проблемой. Кто-нибудь сталкивался с подобной ситуацией? Любое предложение или комментарий высоко оценены.

+0

Дубликат http://stackoverflow.com/questions/41195367/android-gridview-opens-the-same-entry-the-first-clicked-one-in-subsequent-cli – Selvin

+0

Вопрос в том, почему вы не получаете данные непосредственно в ProductDetailActivity ... и из gridview начинаете новую активность только – Selvin

+0

@Selvin, мне нужно передать щелкнутый элемент 'id' в' ProductDetailActivity', где я использую этот идентификатор 'для URL-вызова для получения всей информации, такой как« цена продукта, изображения продукта, местоположение продукта, имя продавца и город продавца »... Другими словами, я также выполняю сетевую операцию в« ProductDetailActivity ». – casillas

ответ

2

Вы можете просто убить действия с помощью финиша(); когда другой загружается.

+0

Я заканчиваю деятельность, но это не проблема. – casillas

+0

Хорошо, я просто просматриваю ваш код. Согласно тому, что вы разместили здесь, вы не заканчиваете работу. Если вы хотите, вы должны называть finish() после каждого startActivity. – EpicCodez

+0

Как это связано с 'pid', который я отправляю из основной в детали? – casillas

0

У меня была такая же проблема. В моем случае в методе onClick позиция была неправильной. Тогда я использовал для установки позиции в качестве тега для определенного вида, в котором установлено OnClickListener, и моя проблема решена. Возможно, это связано с тем, что позиция объявлена ​​как final. Поэтому удалите последнее ключевое слово и попробуйте вот так.

holder.imageView.setImageUrl(imageRecord != null ? imageRecord.getUrl() : null, mImageLoader); 
holder.imageView.setTag(position); 
holder.priceTagRL.setRotation(0); 

И в onClick методе

openProductDetail((int)view.getTag()); 
+0

Если позиция неправильная, почему она получает правильную позицию, когда я использую Wi-Fi? – casillas

0

Проверьте, если ниже ссылку может быть полезным:

https://stackoverflow.com/a/33682366/2798289 (3G соединение может быть на самом деле медленно, что вы должны увеличить порог тайм-аута)

Кроме того, существует вероятность того, что ссылка положения в адаптере может ошибиться в каком-либо краевом корпусе (независимо от вашей фактической проблемы). Вы можете попробовать ниже альтернативный метод ..

Используйте gridView.setOnItemClickListener

gridview.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
       int position, long id) { 
      //do your logic based on the position 
     } 
    }); 

Примечание: В случае, если GridView не в состоянии наблюдать событие нажмём, вы должны установить android:descendantFocusability="blocksDescendants" с точки зрения ребенка корня под GridView , Это может произойти в основном из-за того, что элементы GridView не должны быть кликабельными сами по себе, поскольку они будут наблюдать событие щелчка.

Ссылка: https://developer.android.com/guide/topics/ui/layout/gridview.html

+0

Я изначально реализовал и протестировал этот, но не работал – casillas

Смежные вопросы