2013-07-23 216 views
4

我對android開發非常陌生,我覺得這很簡單,但是我還沒有設法在google上找到任何人遇到同樣的問題。 我有一個GridView充滿了一個TextView(其上有一個圖像)和一個ImageButton(刪除當前項目)。我想要做的是刪除我單擊ImageButton的項目。從GridView中刪除項目

這裏是我公司主營:

public class ActivityMain extends Activity 
{ 
GridView gridview; 
public GridAdapter mainActivityAdapter; 
public ArrayList<String> listService = new ArrayList<String>(); 

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

    listService.add("Market"); 
    listService.add("Recherche"); 
    listService.add("Quiz"); 

    gridview = (GridView) findViewById(R.id.mainActivity_grid); 
    mainActivityAdapter = new GridAdapter(this.getApplicationContext(), listService); 

    gridview.setAdapter(mainActivityAdapter); 

} 

}

這裏是我的適配器:

public class GridAdapter extends BaseAdapter 
    { 
    Context context; 
    ArrayList<String> list = new ArrayList<String>(); 
    GridAdapter adapter = this; 

    public GridAdapter(Context context, ArrayList<String> list) 
    { 
     this.context = context; 
     this.list = list; 
    } 

    @Override 
    public int getCount() 
    { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int arg0) 
    { 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) 
    { 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder holder; 
    if(convertView==null) 
    { 
     convertView = LayoutInflater.from(context).inflate(R.layout.item_gridmain, null); 

     holder = new ViewHolder(); 
     holder.textView = (TextView) convertView.findViewById(R.id.gridMain_text); 
     holder.close = (ImageButton) convertView.findViewById(R.id.mainActivity_delete); 

     convertView.setTag(holder); 
    } 

    else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

// Doing stuff on views 

     holder.close.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View arg1) 
      { 
       // list.remove(position); 
       list.remove(position);    
       adapter.notifyDataSetChanged(); 
      } 
     }); 
     return convertView; 

    } 

public static class ViewHolder 
{ 
    TextView textView; 
    ImageButton close; 
} 

} 

的事情是,當我點擊一個ImageButton的,它總是最後一個項目已被添加,正在被刪除,我無法弄清楚爲什麼或如何解決這個問題。

謝謝。

================== 編輯:

這裏是我的activity_main.xml中:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/main_layout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#DDDDDD" 
android:orientation="vertical" > 

<GridView 
    android:id="@+id/mainActivity_grid" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:layout_marginLeft="5sp" 
    android:layout_marginRight="5sp" 
    android:layout_marginTop="5sp" 
    android:clickable="false" 
    android:gravity="center" 
    android:horizontalSpacing="15dp" 
    android:numColumns="2" 
    android:stretchMode="columnWidth" 
    android:verticalSpacing="10dp" /> 

</LinearLayout> 

而且我item_gridmain.xml:

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

<TextView 
    android:id="@+id/gridMain_text" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_gravity="center" 
    android:textAlignment="center" 
    android:textColor="@android:color/holo_blue_dark" 
    /> 

<ImageButton 
    android:id="@+id/mainActivity_delete" 
    style="?android:attr/borderlessButtonStyle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:contentDescription="@string/deleteFav" 
    android:src="@drawable/boutoncroixfermer" /> 

</RelativeLayout> 
+0

請發佈您的activity_main.xml佈局。 –

回答

2

好吧,其實這是我的o錯誤,我現在感到非常愚蠢。

我實際上刪除了正確的項目,但在每個視圖中,我將位置中的每個項目替換爲首先出現的位置。所以每個項目都是正確的,但圖片/文本是舊的,因爲我正在修改它們在getView()

對不起,失去了時間,我的壞,我想現在打我自己。

+0

你究竟是如何修復它的? – user1810737

+0

我改變了我設置每個項目的文本和圖像的方式。我實際上是「硬編碼」(不知道這是不是正確的英文)每個項目(如位置0將是這個和那個,位置1將是這個和那個)。這顯然是一個壞主意,因爲它會告訴你,你刪除了一個項目,但你不知道你刪除了哪個(我不知道是否清楚,告訴我,如果你不明白)。 –

1

請使用ViewHolder模式,也可以增加你的gridMain_text.xml 否則你會不斷收到點擊 的錯誤的索引 這是ListView的示例,但同樣適用於GridView

+0

已編輯帖子,我切換到ViewHolder。 –

+0

請參閱我的回答 –

0

在偵聽器中添加Log.debug()以確保刪除位置正確。

你怎麼知道點擊後,最後一個項目被刪除?我的意思是,如果在項目視圖中有文本標籤?也許你刪除了正確的項目,但在gridview刷新後,它看起來像最後一個項目被刪除。

您可以在getView中添加setText的位置標籤。這可以幫助您。

好的,我知道。你在哪裏做渲染項目視圖?你必須在getView中執行它。AdapterView緩存它的項目視圖。當你刪除了正確的位置。可能是位置不正確的視圖。你可以運行hierarchyviewer來檢測發生了什麼。

+0

我正在使用日誌顯示「位置」,我只是在發佈前刪除它們。每當我點擊第一個項目的ImageButton時,我可以看到「position = 0」(如果我點擊第二個項目,則= 1),並且在每個情況下,它總是最後一個要移除的項目。 其實我有3個項目開始,無論我想刪除哪一個,它總是第3個,然後是第2個然後第一個被刪除(每個項目有不同的文本/圖像)。 –

2

你在每個項目中都有ImageButton的權利?您可以設置

holder.close.setTag(Integer.valueOf(position)); 

然後,你必須隱藏在右側buttons.Change的OnClickListener像下面所有位置:

close.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      list.remove((Integer) v.getTag()); 
      adapter.notifyDataSetChanged(); 
     } 
    }); 
+0

位置和v.getTag()具有相同的值根據我的日誌,但strangly,做list.remove((整數)arg1.getTag());什麼也不做(我也顯示什麼是在「列表」中,什麼都沒有改變),而list.remove(position)(甚至list.remove(0))實際上做了一些事情。 這對我來說似乎很奇怪:/ –

+0

list.remove(0)從列表中刪除一個項目嗎? – tasomaniac

+0

是的,它刪除列表中的第一項,但最後一個在網格上 –

1

請使用

holder.close.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View arg1) 
     { 
      // list.remove(position); 
      list.remove(position);    
      adapter.notifyDataSetChanged(); 
     } 
    }); 

代替close.setOnClickListener的,我跑你的這段代碼現在它工作正常

+0

對不起,但這已經是我的了,我忘記編輯這部分時,我添加了ViewHolder。 –

+0

我在模擬器中運行你的代碼,它工作正常,,,請嘗試從你的手機/模擬器卸載舊的應用程序,並運行乾淨,並重新安裝 –

+0

嗯,我不知道。我從手機中刪除了應用程序,清理然後重新安裝,沒有任何改變。我也嘗試了另一個電話,同樣的問題仍然存在:如果你想刪除網格上的第一個項目,第一個項目將從列表中刪除,但我們會看到最後一個項目從gridview中消失,而不是第一。 其實我想知道如果問題不是來自我在getView()中的每個項目上做什麼(更改textView規範)。我明天會嘗試第一件事,我會讓你更新。 –