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()。