0

我是Android開發新手。在我的應用程序中,我使用JSON從MySQL數據庫填充RecyclerView,並創建了多個活動。應用程序在我的PC上的模擬器上運行平穩,但是當我嘗試在Android手機上運行應用程序時,它在我點擊RecyclerView中的任何項目時崩潰。每個ListItem都有多個TextView和ImageView。我無法弄清楚什麼是錯的。應用程序崩潰點擊RecyclerView列表項目持有人類

問題區域按我的低估是:

holder.llCountryListItem.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       //Toast.makeText(context, "You clicked on " + countId, Toast.LENGTH_SHORT).show(); 
       Toast.makeText(context, "You clicked on " + context, Toast.LENGTH_SHORT).show(); 

       Intent intent = new Intent(context, CountryDetails.class); 

       intent.putExtra("id", countId); 
       intent.putExtra("name", countryListItem.getName()); 
       intent.putExtra("capital", countryListItem.getCapital()); 
       intent.putExtra("continent", countryListItem.getContinent()); 
       intent.putExtra("population", countryListItem.getPopulation()); 

       context.startActivity(intent); 
      } 
     }); 

的適配器和支架完整代碼RecyclerView時listItems:

public class CountryAdapter extends RecyclerView.Adapter<CountryAdapter.ViewHolder> { 

    private List<CountryListItem> countryListItems; 
    private Context context; 

    public CountryAdapter(List<CountryListItem> countryListItems, Context context) { 
     this.countryListItems = countryListItems; 
     this.context = context; 
    } 

    @Override 
    public CountryAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.country_list_item, parent, false); 
     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(CountryAdapter.ViewHolder holder, int position) { 
     final CountryListItem countryListItem = countryListItems.get(position); 

     holder.textViewName.setText(countryListItem.getName()); 
     holder.textViewCapital.setText(countryListItem.getCapital()); 
     holder.textViewId.setText(countryListItem.getContinent() + "\nPopulation: " + countryListItem.getPopulation() + " - GDP: " + countryListItem.getGdp()); 

     final int countId; 

     countId = (Integer) countryListItem.getId(); 

     Picasso.with(context) 
       .load(imageURL) 
       .into(holder.imCountry); 

     holder.llCountryListItem.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Toast.makeText(context, "You clicked on " + context, Toast.LENGTH_SHORT).show(); 

       Intent intent = new Intent(context, CountryDetails.class); 

       intent.putExtra("id", countId); 
       intent.putExtra("name", countryListItem.getName()); 
       intent.putExtra("capital", countryListItem.getCapital()); 
       intent.putExtra("continent", countryListItem.getContinent()); 
       intent.putExtra("population", countryListItem.getPopulation()); 

       context.startActivity(intent); 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return countryListItems.size(); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder{ 

     public TextView textViewId; 
     public TextView textViewName; 
     public TextView textViewCapital; 

     public ImageView imCountry; 

     public LinearLayout llCountryListItem; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      textViewId = (TextView) itemView.findViewById(R.id.tvId); 
      textViewName = (TextView) itemView.findViewById(R.id.tvName); 
      textViewCapital = (TextView) itemView.findViewById(R.id.tvCapital); 
      imCountry = (ImageView) itemView.findViewById(R.id.imCountry); 

      llCountryListItem = (LinearLayout) itemView.findViewById(R.id.llCountryListItem); 
     } 
    } 
} 

和XML我的列表項的看法是:

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

    <android.support.v7.widget.CardView 
     android:layout_margin="5dp" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <LinearLayout 
      android:id="@+id/llCountryListItem" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:background="@android:color/holo_blue_dark" 
      android:padding="1dp"> 

      <TextView 
       android:id="@+id/tvName" 
       android:text="Name" 
       android:textSize="16sp" 
       android:textStyle="bold" 
       android:textColor="#ffffff" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" /> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:padding="2dp" 
       android:background="@android:color/holo_blue_light"> 

       <ImageView 
        android:id="@+id/imCountry" 
        android:layout_gravity="center" 
        android:layout_width="70dp" 
        android:layout_height="45dp" /> 

       <LinearLayout 
        android:paddingLeft="@dimen/activity_horizontal_margin" 
        android:orientation="vertical" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"> 

        <TextView 
         android:id="@+id/tvCapital" 
         android:textSize="14sp" 
         android:textStyle="bold" 
         android:textColor="#efefef" 
         android:text="Capital" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" /> 

        <TextView 
         android:id="@+id/tvId" 
         android:text="Asia, Population: 185,963,247" 
         android:textSize="12sp" 
         android:textColor="#fafafa" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" /> 

       </LinearLayout> 

      </LinearLayout> 
     </LinearLayout> 

    </android.support.v7.widget.CardView> 
</LinearLayout> 
+2

您可能想包含logcat的堆棧跟蹤。 –

+0

你絕對應該遵循Andrej Jurkins的建議併發布堆棧跟蹤。我要檢查的前兩個原因是在未初始化的對象上調用方法,或者在主線程上運行長時間的操作。我在代碼中看不到類似的內容。可能是這個問題實際上是在'CountryDetails'中。 – Lukasz

+0

@AndrejJurkin這裏是logcat。它說 致命異常:主要 進程:com.ardentlabs.globalencyc,PID:17419 android.util.AndroidRuntimeException:從Activity上下文外調用startActivity()需要FLAG_ACTIVITY_NEW_TASK標誌。這真的是你想要的嗎? –

回答

0

看來您傳遞給適配器的上下文可能是ApplicationContext。在這種情況下,該行添加到您的意圖

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

或確保上下文是活動類型(YourActivity.this)的。

還在適配器類中存儲Context並不是一個好主意,這可能會導致潛在的內存泄漏。如果可能的話,綁定視圖時使用view.getContext()。