2

Код работает, но проблема в том, что некоторые элементы повторяются в текстовом представлении, а некоторые не учитываются. Например, «Кто мы» отображается дважды. Также я не мог центрировать элементы textview. Я опубликовал снимок экрана. Я новичок в программировании для Android, так что помогите мне, кто угодно.Повторение элементов сетки ...!

Это Основная деятельность

public class MainActivity extends Activity { 

    GridView grid; 
    public WebView webView; 
    public int pos; 

    String[] desc = { "Who We Are", "What We Do", "Entrepreneur", "Scholarship", "Admission", 
      "Internship", "Industrial Visit", "Project", "Buy or Sell Projects", "Free Training", "College Registration", 
      "Information", "Feedback", "Contact" }; 


    int[] imageId = { R.drawable.dummy, R.drawable.dummy, R.drawable.dummy, 
      R.drawable.dummy, R.drawable.dummy, R.drawable.dummy, 
      R.drawable.dummy, R.drawable.dummy, R.drawable.dummy, 
      R.drawable.dummy, R.drawable.dummy, R.drawable.dummy, 
      R.drawable.dummy, R.drawable.dummy 

    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activitymain); 

     GridDesign adapter = new GridDesign(MainActivity.this, desc, imageId); 
     grid = (GridView) findViewById(R.id.grid); 
     grid.setAdapter(adapter); 
     grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       pos = position; 
       Intent intent = new Intent(MainActivity.this, webView.class); 
       startActivity(intent); 
      } 
     }); 

    } 

} 

Это пользовательский класс вид сетки.

public class GridDesign extends BaseAdapter{ 
    private Context mContext; 
    private final String[] desc; 
    private final int[] Imageid; 

    public GridDesign(Context c, String[] web, int[] Imageid) { 
     mContext = c; 
     this.Imageid = Imageid; 
     this.desc = web; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return desc.length; 
    } 

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     View grid; 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) { 

      grid = new View(mContext); 
      grid = inflater.inflate(R.layout.grid_element, parent, false); 
      TextView textView = (TextView) grid.findViewById(R.id.grid_text); 
      ImageView imageView = (ImageView) grid 
        .findViewById(R.id.grid_image); 
      textView.setText(desc[position]); 
      imageView.setImageResource(Imageid[position]); 
     } else { 
      grid = (View) convertView; 
     } 

     return grid; 
    } 
} 

Это основной раскладке активность

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <GridView 
     android:id="@+id/grid" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:columnWidth="100dip" 
     android:gravity="center" 
     android:numColumns="2" 
     android:stretchMode="spacingWidthUniform" /> 

</LinearLayout> 

Это компоновки одного элемента сетки

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/grid_image" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:contentDescription="@string/im" > 
    </ImageView> 

    <TextView 
     android:id="@+id/grid_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:maxLength="23" 
     android:gravity="center" 
     android:layout_marginTop="10sp" 
     android:textSize="12sp" > 
    </TextView> 

</LinearLayout> 

ответ

1

Ваш метод getView не сбрасывает содержимое вашего View если convertView не null. Если convertView не null, вам необходимо установить содержимое, в противном случае оно сохранит старое содержимое со старого представления, и вы увидите дублированные данные. Если convertView не null, это означает, что вы повторно используете представление, прокручиваемое с экрана (это делает более гладкой прокрутку, так как вам не нужно, чтобы представления перераспределялись и освобождались при прокрутке. Поэтому это повторное использование означает, что вы будете см. некоторые повторения элементов и некоторых элементов, поскольку в вашем методе getView вы не сбросили содержимое при повторном использовании представления.

Чтобы исправить это, вы можете переместить свой код, который устанавливает содержимое представления вне вашего if так что вы делаете что-то вроде:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View grid; 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (convertView == null) { 

     grid = new View(mContext); 
     grid = inflater.inflate(R.layout.grid_element, parent, false); 
    } else { 
     grid = (View) convertView; 
    } 

    TextView textView = (TextView) grid.findViewById(R.id.grid_text); 
    ImageView imageView = (ImageView) grid 
      .findViewById(R.id.grid_image); 
    textView.setText(desc[position]); 
    imageView.setImageResource(Imageid[position]); 
    return grid; 
} 
+0

Спасибо, что сработали просто отлично. –

+0

Немного помочь с выравниванием выравнивания текста внутри элемента сетки сделало бы чудеса для меня. –

+0

Как ваш 'LinearLayout' является' vertical', я предполагаю, что вы хотите, чтобы 'TextView' находился под изображением? Если это так, вам просто нужно установить 'android: layout_width =" match_parent "' на 'TextView' – HexAndBugs

0

Проблема вызвана повторным использованием рециркуляции d view, вы можете получать представления, уже сделанные из ранее. Вы можете инициализировать мнение, каждый раз, переписывая код так:

 if (convertView == null) { 

     grid = new View(mContext); 
     grid = inflater.inflate(R.layout.grid_element, parent, false); 
     } else { 
     grid = (View) convertView; 
     } 

     TextView textView = (TextView) grid.findViewById(R.id.grid_text); 
     ImageView imageView = (ImageView) grid 
       .findViewById(R.id.grid_image); 
     textView.setText(desc[position]); 
     imageView.setImageResource(Imageid[position]); 

или еще лучше, принять ViewHolder шаблон (View Holder Pattern).

+0

Получил, спасибо. –

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