2016-03-03 188 views
0

我已將圖像按鈕放置在CardView內部的圖像視圖頂部。我想在用戶點擊圖像按鈕時觸發一些操作。然而,第一個問題是當我在MainActivity中使用findViewById獲取圖像按鈕時,它返回null(可能是因爲圖像視圖在item_row xml中,它顯示了卡片視圖中的行數據)。在卡片視圖中放置在圖像視圖中的圖像按鈕不會觸發Onclick事件

另一個問題是如何解決這種情況,其中activity_main.xml不同,其中包含具有item_row.xml圖像視圖頂部的圖像按鈕的回收站視圖。

MainActivity.java

package com.innovation.myapp.jwelleryonrent.View; 

import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v4.widget.SwipeRefreshLayout; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.Toolbar; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ImageButton; 
import android.widget.Toast; 

import com.innovation.myapp.jwelleryonrent.R; 
import com.innovation.myapp.jwelleryonrent.controller.jwelleryController; 
import com.innovation.myapp.jwelleryonrent.model.adapter.CustomItemClickListner; 
import com.innovation.myapp.jwelleryonrent.model.adapter.JwelleryAdapter; 
import com.innovation.myapp.jwelleryonrent.model.pojo.JwelleryCollection; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity implements jwelleryController.JwelleryCallbackListener { 
    private Toolbar mToolbar; 
    private RecyclerView mRecyclerView; 
    private SwipeRefreshLayout mSwipeRefreshLayout; 
    private List<JwelleryCollection> mJwelleryList = new ArrayList<>(); 
    private JwelleryAdapter mJwelleryAdapter; 
    private jwelleryController mController; 
    private boolean isInFavourites = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     configToolbar(); 
     mController = new jwelleryController(MainActivity.this); 
     configViews(); 
     ImageButton imgButton = (ImageButton) findViewById(R.id.favIcon); 
     imgButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Snackbar.make(v, "Item Added", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 


     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 




    } 


    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) 
    { 
     View rootView = inflater.inflate(R.layout.item_row, container, false); 
     ImageButton imgBtn = (ImageButton) findViewById(R.id.favIcon); 
     imgBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       addItemToBag(v); 
      } 
     }); 
     return rootView; 
    } 


    private void addItemToBag(View v) 
    { 
     isInFavourites = true; 
     ImageButton btnFaviourite = (ImageButton) findViewById(R.id.favIcon); 
     if(isInFavourites==true) { 

      btnFaviourite.setImageResource(R.drawable.ic_favorite_white_24dp); 
     } 
     else 
      btnFaviourite.setImageResource(R.drawable.ic_favorite_border); 
     Snackbar.make(v, "Item added to Favourites", Snackbar.LENGTH_LONG) 
       .setAction("Action", null).show(); 
    } 


    private void configToolbar() { 
     mToolbar = (Toolbar) this.findViewById(R.id.toolbar); 
     setSupportActionBar(mToolbar); 
    } 

    private void initializeAdapter() 
    { 

     mJwelleryAdapter = new JwelleryAdapter(mJwelleryList); 

     mJwelleryAdapter.setOnItemClickListner(new CustomItemClickListner() { 
      @Override 
      public void onItemClick(View v, int position) { 
       Toast.makeText(MainActivity.this, "Clicked Item: "+position,Toast.LENGTH_LONG).show(); 
      } 
     }); 

//  mJwelleryAdapter = new JwelleryAdapter(mJwelleryList, new CustomItemClickListner() { 
//   @Override 
//   public void onItemClick(View v, int position) { 
//    Toast.makeText(MainActivity.this, "Clicked Item: "+position,Toast.LENGTH_LONG).show(); 
//   } 
//  }); 
     mRecyclerView.setAdapter(mJwelleryAdapter); 

     mSwipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.colorAccent), 
       getResources().getColor(R.color.colorPrimary), 
       getResources().getColor(R.color.colorPrimaryDark)); 

     mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       mController.startFetching(); 
      } 
     }); 


    } 


    private void configViews() { 
     mRecyclerView = (RecyclerView) this.findViewById(R.id.list); 
     mSwipeRefreshLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipe); 

     mRecyclerView.setHasFixedSize(true); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); 
     mRecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool()); 
     mController.startFetching(); 
     initializeAdapter(); 
//  mJwelleryAdapter= new JwelleryAdapter(mJwelleryList); 

    } 

     @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

     @Override 
     public void onFetchStart() { 

     } 

     @Override 
     public void onFetchProgress(JwelleryCollection jwellery) { 
      mJwelleryAdapter.addJwellery(jwellery); 
     } 

     @Override 
     public void onFetchProgress(List<JwelleryCollection> jwelleryList) { 

     } 

     @Override 
     public void onFetchComplete() { 
      mSwipeRefreshLayout.setRefreshing(false); 
     } 

     @Override 
     public void onFetchFailure() { 

     } 
} 

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context=".MainActivity"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" 
     android:elevation="8dp"/> 

</android.support.design.widget.AppBarLayout> 

<include layout="@layout/content_main" /> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|end" 
    android:layout_margin="@dimen/fab_margin" 
    android:src="@android:drawable/ic_dialog_email" /> 

</android.support.design.widget.CoordinatorLayout> 

item_row.xml其中含有關於圖像查看頂部圖像按鈕(ID =圖標)。我想觸發行動的favicon

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_margin="8dp" 
card_view:cardCornerRadius="1dp" 
> 

<RelativeLayout 

    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="8dp" 
    android:layout_margin="5dp" 
    > 

    <ImageView 
     android:id="@+id/flowerImage" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 

     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" 
     android:visibility="visible"/> 
    <ImageButton 
     android:id="@+id/favIcon" 
     android:layout_width="32dp" 
     android:layout_height="32dp" 
     android:scaleType="fitXY" 
     android:layout_margin="5dp" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:background="@drawable/ic_favorite_border" 
     /> 



    <LinearLayout 

     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/flowerImage" 

     android:orientation="vertical" 
     > 

     <TextView 
      android:id="@+id/flowerName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Medium Text" 
      android:textColor="@color/colorPrimary" 
      android:textAppearance="?android:attr/textAppearanceMedium" 

/> 

     <TextView 
      android:id="@+id/flowerCategory" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Small Text" 
      android:layout_alignBottom="@id/flowerName" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:visibility="visible"/> 

     <TextView 
      android:id="@+id/flowerPrice" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@id/flowerCategory" 
      android:text="New Text" 
      android:visibility="visible"/> 

     <TextView 
      android:id="@+id/flowerInstruction" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:visibility="gone" 
      android:text="New Text" 
/> 

    </LinearLayout> 


</RelativeLayout> 

</android.support.v7.widget.CardView> 

代碼ViewHolder類,

public class Holder extends RecyclerView.ViewHolder { 

    public TextView mName, mCategory, mPrice, mInstructions; 
    public ImageView mImage; 


    public Holder(View itemView) { 
     super(itemView); 
     mImage = (ImageView) itemView.findViewById(R.id.flowerImage); 
     mName = (TextView) itemView.findViewById(R.id.flowerName); 
     mCategory = (TextView) itemView.findViewById(R.id.flowerCategory); 
     mPrice = (TextView) itemView.findViewById(R.id.flowerPrice); 
     mInstructions = (TextView) itemView.findViewById(R.id.flowerInstruction); 

     ImageButton imgButton = (ImageButton) itemView.findViewById(R.id.favIcon); 
     imgButton.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       addItemToBag(v); 
      } 
     }); 


    } 


    public Holder(View itemView,int ViewType,Context c) { 
    // Creating ViewHolder Constructor with View and viewType As a parameter 
     super(itemView); 

    } 
+0

你提的問題是非常不清楚,你爲什麼用引號?只需寫純文本。您發佈的所有內容都是xml,但您聲明您的'onClick'不起作用,因爲'findViewById'爲空。發佈您的實際代碼。你的'ImageButton'爲null的原因很可能是因爲你在你的'Activity'中調用它,但是你在適配器中膨脹視圖。 – Pztar

+0

@Vimal你可以分享你設置onClickListener爲imageButton的Java代碼? –

+0

這裏是MainActivity.java的代碼onCreate ImageButton imgButton =(ImageButton)findViewById(R.id.favIcon); //這裏我得到imgButton爲空 imgButton.setOnClickListener(新View.OnClickListener(){ @覆蓋 公共無效的onClick(視圖v){ Snackbar.make(V 「產品加入」,Snackbar.LENGTH_LONG) .setAction(「Action」,null).show(); } }); – Vimal

回答

0

嘗試(rootView補充):

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
{ 
    View rootView = inflater.inflate(R.layout.item_row, container, false); 
    ImageButton imgBtn = (ImageButton) rootView.findViewById(R.id.favIcon); 
    imgBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      addItemToBag(v); 
     } 
    }); 
    return rootView; 
} 
+0

當onCreateView被顛倒時?因爲現在當我點擊圖像按鈕時它不會觸發。 我做的另一種方法是將onCreateView的整個代碼放在ViewHolder構造函數中,圖像按鈕點擊被觸發,但是當我滾動列表時,addItemToBag函數代碼被執行,雖然我沒有點擊任何其他卡的圖像按鈕。 – Vimal

+0

您是否建議解決上述問題? – Vimal

+0

我看不到您的持有者代碼,請寄給我。 這是您在持有人構造函數中執行此操作的權利。 – MahDi

相關問題