Изменение порядка элементов в Android GridView при отображении Admob - PullRequest
3 голосов
/ 13 марта 2012

Я искал эти проблемы и пробовал большинство из приведенных ответов, но моя проблема еще не решена.Моя сетка имеет около 10-12 элементов, и каждый элемент имеет ImageView и TextView.изображение и тексты динамически загружаются из ресурсов.

Проблема 1: При прокрутке сетки изменяется порядок элементов.первые элементы идут вниз, а последние элементы идут вверх

Проблема 2: когда в нижней части экрана появляется объявление Admob, все элементы сетки смешиваются. Даже без прокрутки.

Проблема 3: В настоящее время я поместил onClickListeners в ImageView Only.Как добавить тот же OnclickListener к соответствующему TextView, а также

Я использовал общий код генерации сетки, который можно найти везде в сети.

Вот мой код

public class ImageAdapter extends BaseAdapter{
      Context myContext;

      public ImageAdapter(Context _myContext){
         myContext = _myContext;
      }

      @Override
      public View getView(final int position, View convertView, ViewGroup parent) {
         View MyView = convertView;

         try{

         if ( convertView == null ){
            LayoutInflater li = ((Activity)myContext).getLayoutInflater();
            MyView = li.inflate(R.layout.weather_grid, null);

            TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text);        

            Resources res = getResources();
            String[] items = res.getStringArray(R.array.weather_items);

            final String[] titles = new String[items.length];
            int x = 0;
            for(String item:items){

                titles[x]=item;
                x++;
            }

           // getStringFromRes(titles[position]);
            tv.setText(titles[position]);

            // Add The Image!!!           
            final ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image);
            Class<drawable> resources = R.drawable.class;
            Field[] fields = resources.getFields();
            String[] imageName = new String[fields.length];     
            int index = 0;
            for( Field field : fields )
            {

                if(field.getName().startsWith("weather")){
                    imageName[index] = field.getName();
                    index++;
                }
            }
            iv.setImageResource(getDrawable(myContext, imageName[position]));

            iv.setOnClickListener(new OnClickListener() {               
                @Override
                public void onClick(View v) {
                    System.out.println("Clicked Item = " +      titles[position]);
                    Bundle b = new Bundle();
                    if(titles[position].equals("Weather Overview")){
                        startActivity(new Intent(WeatherGridActivity.this, WeatherActivity.class));
                    }
                    if(titles[position].equals("Current Weather")){
                        b.putString("display", "current");
                        Intent intent = new Intent(WeatherGridActivity.this,WeatherActivity.class);
                        intent.putExtras(b);
                        startActivityForResult(intent, 0);
                        //startActivity(new Intent(WeatherGridActivity.this, WeatherActivity.class));
                    }
                    if(titles[position].equals("Ask a Question")){
                        startActivity(new Intent(WeatherGridActivity.this, AskQuestionActivity.class));
                    }
                    if(titles[position].equals("Average Temperature")){
                        startActivity(new Intent(WeatherGridActivity.this, AverageTemperatureActivity.class));
                    }
                }
            });
         }
         }catch(Exception e){
             System.out.println("Error Occured = " + e.getMessage());
             e.printStackTrace();
         }

         return MyView;
      }

      @Override
      public Object getItem(int arg0) {
         // TODO Auto-generated method stub
         return null;
      }

      @Override
      public long getItemId(int arg0) {
         // TODO Auto-generated method stub
         return 0;
      }

    @Override
    public int getCount() {
        return 10;
    }

      public int getDrawable(Context context, String name){
            Assert.assertNotNull(context);
            Assert.assertNotNull(name);
            return context.getResources().getIdentifier(name,"drawable", context.getPackageName());
       }

      public String getStringFromRes(String name){
            try{
                int resId = (Integer) R.string.class.getField(name).get(null);
               // Toast.makeText(MyContext, getResources().getString(resId), Toast.LENGTH_LONG).show();
                return getResources().getString(resId);
            }catch(Exception e){
                // no such string
                return "empty";
            }
        }
   }

Вот xml

    <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/bg"
        android:orientation="vertical" >

        <GridView
            android:id="@+id/weather"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/bg"
            android:columnWidth="70dp"
            android:gravity="center_horizontal"
            android:horizontalSpacing="20dp"
            android:numColumns="auto_fit"
            android:padding="20dp"
            android:stretchMode="columnWidth"
            android:tileMode="repeat"
            android:verticalSpacing="20dp" >
        </GridView>

        <ImageView
            android:id="@+id/back_button"
            style="@style/book_button" />

        <com.google.ads.AdView
            android:id="@+id/adView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            ads:adSize="BANNER"
            ads:adUnitId="dummy id"
            ads:loadAdOnCreate="true"
            ads:testDevices="TEST_EMULATOR, TEST_DEVICE_ID" />
    </LinearLayout>

</ScrollView>

Я добавил RelativeLayout вместо LinerLayout и ScrollViews, но теперь вся Grid не отображается, а реклама отображается правильно.Вот новый xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    android:id="@+id/home_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg"
    >

    <GridView
        android:id="@+id/home_grid"
        android:layout_width="wrap_content"
        android:layout_height="0dip"
        android:columnWidth="100dp"
        android:rowHeight="30dp"
        android:gravity="center_horizontal"
        android:horizontalSpacing="5dp"
        android:numColumns="auto_fit"
        android:stretchMode="none"
        android:tileMode="repeat"
        android:verticalSpacing="30dp" 
        >
    </GridView>

    <com.google.ads.AdView
        android:layout_alignParentBottom="true"
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        ads:adSize="BANNER"
        ads:adUnitId="dummy id"
        ads:loadAdOnCreate="true"
        ads:testDevices="TEST_EMULATOR, TEST_DEVICE_ID"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

Ваши ответы высоко оценены Спасибо

1 Ответ

0 голосов
/ 14 марта 2012

Вот рабочий код. Это исправляет проблему с прокруткой, проблему Admob и проблему onClickListener.

 public class ImageAdapter extends BaseAdapter{
          Context myContext;

          public ImageAdapter(Context _myContext){
             myContext = _myContext;    
             layoutInflater = LayoutInflater.from(myContext);
                Resources res = getResources();
                String[] items = res.getStringArray(R.array.weather_items);           
                titles = new String[items.length];
                int x = 0;
                for(String item:items){
                    titles[x]=item;
                    x++;
                }

                Class<drawable> resources = R.drawable.class;
                Field[] fields = resources.getFields();
                imageName = new String[fields.length];     
                int index = 0;
                for( Field field : fields ){
                    if(field.getName().startsWith("weather")){
                        imageName[index] = field.getName();
                        index++;
                    }
                }

          }

          @Override
          public View getView(final int position, View convertView, ViewGroup parent) {
            // View MyView = convertView;
             View grid = null;
             try{

             if ( convertView == null ){
                 grid = new View(myContext);
               // LayoutInflater li = ((Activity)myContext).getLayoutInflater();
                grid = layoutInflater.inflate(R.layout.weather_grid, null);
             }else{
                 grid = (View)convertView;
             }
                TextView tv = (TextView)grid.findViewById(R.id.grid_item_text);        
                tv.setText(titles[position]);         
                ImageView iv = (ImageView)grid.findViewById(R.id.grid_item_image);

                iv.setImageResource(getDrawable(myContext, imageName[position]));

                iv.setOnClickListener(new OnClickListener() {               
                    @Override
                    public void onClick(View v) {
                        executeListners(position);
                    }
                });

                tv.setOnClickListener(new OnClickListener() {               
                    @Override
                    public void onClick(View v) {
                        executeListners(position);
                    }
                });
             }catch(Exception e){
                 System.out.println("Error Occured = " + e.getMessage());
                 e.printStackTrace();
             }

             return grid;
          }



          @Override
          public Object getItem(int arg0) {
             // TODO Auto-generated method stub
             return null;
          }

          @Override
          public long getItemId(int arg0) {
             // TODO Auto-generated method stub
             return 0;
          }

        @Override
        public int getCount() {
            return 10;
        }

          public int getDrawable(Context context, String name){
                Assert.assertNotNull(context);
                Assert.assertNotNull(name);
                return context.getResources().getIdentifier(name,"drawable", context.getPackageName());
           }

          public String getStringFromRes(String name){
                try{
                    int resId = (Integer) R.string.class.getField(name).get(null);
                   // Toast.makeText(MyContext, getResources().getString(resId), Toast.LENGTH_LONG).show();
                    return getResources().getString(resId);
                }catch(Exception e){
                    return "empty";
                }
            }
       }

XML-файлы не имеют изменений. Это работает либо с RelativeLayout, либо с LinearLayout

...