2013-05-09 44 views
1

我有一個自定義適配器的列表視圖。 ListView中的自定義行包含2個圖像按鈕,當我點擊它時需要處理某些東西。 但它不能像我想要的那樣工作,因爲當我啓動應用程序並單擊圖像按鈕時,沒有任何反應,但如果我先點擊該行然後在imageButton上,然後點擊正在處理中。 我嘗試了一些幫助其他用戶的解決方案,但沒有人遇到與我一樣的問題,因此在點擊一行後會得到處理。處理imageButton在自定義列表視圖內點擊

FavoriteActivity

public class FavoriteActivity extends Activity { 

    private List<Favorite> favoriteItem = new ArrayList<Favorite>(); 
    ViewHolder holder = new ViewHolder(); 


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

     populateFavoriteList(); 
     populateListview(); 
     registerClickCallBack(); 
    } 


    private void populateFavoriteList() { 
     favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 1")); 
     favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 2")); 
     favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 3")); 
     favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 4")); 
     favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 5")); 
     favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 6")); 
     favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 7")); 
     favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 8")); 
    } 

    private void populateListview() { 
     ArrayAdapter<Favorite> adapter = new MyListAdapter(); 
     ListView list = (ListView) findViewById(R.id.favoriteList); 
     list.setAdapter(adapter); 
    } 

    private class MyListAdapter extends ArrayAdapter<Favorite> { 
     public MyListAdapter() { 
      super(FavoriteActivity.this, R.layout.favorite_row, favoriteItem); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // To be sure we have a view, because null is possible 
      View itemView = convertView; 
      if (itemView == null) { 
       itemView = getLayoutInflater().inflate(R.layout.favorite_row, parent, false); 
      } 

      // Find the item to work with 
      Favorite currentItem = favoriteItem.get(position); 

      // Filling the View   
      holder.thumbnail = (ImageButton) itemView.findViewById(R.id.favoriteThumbnail); 
      holder.thumbnail.setBackgroundResource(currentItem.getThumbnail()); 

      holder.name = (TextView) itemView.findViewById(R.id.favoriteName); 
      holder.name.setText(currentItem.getName()); 
      return itemView; 
     } 
    } 

    private void registerClickCallBack() { 

     ListView list = (ListView) findViewById(R.id.favoriteList); 
     list.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
      @Override 
      public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {   

       final Favorite favoriteClicked = favoriteItem.get(position); 
       String msg = "Clicked position " + position + " which is " + favoriteClicked.getName();//Can I use my holder here to get the name back?? Because it wasn't working...    
       Toast.makeText(FavoriteActivity.this, msg, Toast.LENGTH_LONG).show(); 

       ImageButton btnDirections = (ImageButton) viewClicked.findViewById(R.id.favoriteDirections); 
       ImageButton btnDelete = (ImageButton) viewClicked.findViewById(R.id.favoriteDelete);     

       btnDirections.setOnClickListener(new OnClickListener() { 
        String btnmsg = "getting directions for " + favoriteClicked.getName(); 
        @Override 
        public void onClick(View v) {      
         Toast.makeText(FavoriteActivity.this, btnmsg, Toast.LENGTH_LONG).show();       
        } 
       }); 

       btnDelete.setOnClickListener(new OnClickListener() { 
        String btnmsg = "getting delete for " + favoriteClicked.getName(); 
        @Override 
        public void onClick(View v) {      
         Toast.makeText(FavoriteActivity.this, btnmsg, Toast.LENGTH_LONG).show();       
        } 
       });    
      }   
     });   
    } 

    static class ViewHolder { 
     ImageButton thumbnail; 
     TextView name; 
    } 
} 

FavoriteClass

public class Favorite { 

    private int favoriteThumbnail; 
    private String favoriteName;  

    public Favorite(int favoriteThumbnail, String favoriteName){ 
     super(); 
     this.favoriteThumbnail = favoriteThumbnail; 
     this.favoriteName = favoriteName; 
    } 

    public int getThumbnail(){ 
     return favoriteThumbnail; 
    } 

    public String getName(){ 
     return favoriteName; 
    } 
} 

favorite_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:weightSum="4" 
    android:descendantFocusability="blocksDescendants"> 

    <ImageButton 
     android:layout_width="75dp" 
     android:layout_height="65dp" 
     android:contentDescription="thumbnail" 
     android:src="@drawable/icon_camera" 
     android:layout_weight="2" 
     android:id="@+id/favoriteThumbnail" 
     android:scaleType="fitXY" 
     style="@style/favoriteRowItems" 
     android:focusable="false"/> 

    <TextView 
     android:id="@+id/favoriteName" 
     android:layout_weight="2" 
     android:layout_gravity="center_vertical" 
     android:text="Name" 
     android:textSize="30sp" 
     style="@style/favoriteRowItems"/> 

    <ImageButton 
     android:contentDescription="Direction" 
     android:layout_weight="0.5" 
     android:src="@drawable/icon_directions" 
     android:id="@+id/favoriteDirections" 
     style="@style/favoriteRowItems" 
     android:focusable="false"/> 

    <ImageButton 
     android:contentDescription="Delete from favorite" 
     android:layout_weight="0.5" 
     android:src="@drawable/icon_delete" 
     android:id="@+id/favoriteDelete" 
     style="@style/favoriteRowItems" 
     android:layout_marginRight="5dp" 
     android:focusable="false"/> 

</LinearLayout> 

回答

1

添加您的兩個按鈕的getView方法,並將它們包括在您的處理程序,然後在通通過你想分配的getView方法點擊收聽這樣的:

holder.btnDelete.setOnClickListener(new OnClickListener() { 
    String btnmsg = "getting delete for " + favoriteClicked.getName(); 
    @Override 
    public void onClick(View v) {      
     Toast.makeText(FavoriteActivity.this, btnmsg, Toast.LENGTH_LONG).show(); 
    } 
}); 

所以你ViewHolder類將是這樣的:

static class ViewHolder { 
     ImageButton thumbnail; 
     TextView name; 
     ImageButton btnDelete; 
     ImageButton btnDirections; 
    } 

,你設立在getView()方法的按鈕按其他視圖

holder.btnDirections=(ImageButton)itemView.findViewById(R.id.favoriteDirections); 
holder.btnDelete=(ImageButton)itemView.findViewById(R.id.favoriteDelete); 
+0

這工作。但是現在點擊圖像按鈕不會給我名字。將此更改爲holder.name,不需要再與持有人持有?使用'String btnmsg =「正在刪除」+ holder.name;' – mXX 2013-05-09 11:32:53

0

那麼,您正在初始化ListView的onItemClickListener()中的按鈕的點擊監聽器,當然,它只會在點擊該行後才起作用。

您需要在getView()方法中設置它們。但是請注意,在ListView項目中提供可點擊的項目並不是真正的標準做法。

相關問題