2

代碼正在工作,但問題在於,某些元素在文本視圖中重複出現,有些元素被忽略。例如「我們是誰」會顯示兩次。此外,我無法集中textview元素。我已經發布了它的截圖。我是android編程新手,所以幫助我,任何人。重複gridview元素.....!

這是主要活動

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如果convertViewnull。如果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

對網格元素內的textview對齊的一點幫助對我來說會有奇蹟。 –

+0

由於你的'LinearLayout'是'vertical',我假設你想要在圖像下面居中的'TextView'?如果是這樣,你只需要在'TextView'上設置'android:layout_width ='match_parent''' – HexAndBugs

0

該問題是由再利用回收d視圖,您可能會從之前獲得已經未使用的視圖。你可以在每次初始化視圖,改寫這樣的代碼:

 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

明白了,謝謝。 –