2016-06-17 1 views
1

Новое для Android-разработчика и пытается получить Контекст в моем адаптере приложения, но я продолжаю получать исключения из нуля. Моя попытка загрузить строку url в glide, но glide.with(context) не работает. Приложение извлекает значения из sqlite (эта часть отлично работает), теперь я пытаюсь получить одно из этих значений (url) и установить его в изображение через glide. XML имеет все необходимые представления.Контекст адаптера для Android

ошибка: Вы не можете создать нагрузку на нулевой контекст в com.bumptech.glide.manager.RequestManagerRetriever.get

UsersAdapter.java

public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UserViewHolder> { 
private ArrayList<User> mDataSet; 

public UsersAdapter(ArrayList<User> mDataSet) { 
    this.mDataSet = mDataSet; 
} 

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

@Override 
public void onBindViewHolder(UserViewHolder holder, int position) { 

    holder.name_entry.setText(mDataSet.get(position).getName()); 
    holder.email_entry.setText(mDataSet.get(position).getEmail()); 
    holder.icon_entry.setText(""+mDataSet.get(position).getName().charAt(0)); 

    String name = mDataSet.get(position).getName(); 
    String url = mDataSet.get(position).getEmail(); 

    // load image into imageview using glide 
    Glide.with(context) 
      .load(url) 
      .asBitmap() 
      .placeholder(R.drawable.ic_blank) 
      .error(R.drawable.ic_blank) 
      .into(holder.ivFavorites); 
} 

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

public class UserViewHolder extends RecyclerView.ViewHolder { 
    CardView cardView; 
    TextView name_entry, email_entry, icon_entry; 
    ImageView ivFavorites; 

    UserViewHolder(View itemView) { 
     super(itemView); 
     cardView = (CardView) itemView.findViewById(R.id.user_layout); 
     name_entry = (TextView) itemView.findViewById(R.id.name_entry); 
     email_entry = (TextView) itemView.findViewById(R.id.email_entry); 
     icon_entry = (TextView) itemView.findViewById(R.id.icon_entry); 
     ivFavorites = (ImageView) itemView.findViewById(R.id.ivFavorites); 
    } 
} 

@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
} 
} 

Чтение о адаптерах и контексте Я пробовал следующее, но с минимальным успехом.

public class UsersAdapter extends  RecyclerView.Adapter<UsersAdapter.UserViewHolder> { 
private ArrayList<User> mDataSet; 
private Context context; 
public UsersAdapter(ArrayList<User> mDataSet) { 
    this.mDataSet = mDataSet; 
} 
public UsersAdapter(ArrayList<User> mDataSet, Context context) { 
    this.context = context; 
} 

Мои Favorites.java активность, которая тянет значения из SQLite и отображает их в cardview (это также работает хорошо, хотя я не могу скользить, чтобы загрузить изображение):

общественный класс Избранные расширяет AppCompatActivity {

private RecyclerView recyclerView; 
private LinearLayoutManager layoutManager; 
private UsersAdapter adapter; 
private DBHandler dbHandler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_favorites); 
    recyclerView = (RecyclerView) findViewById(R.id.usersList); 
    recyclerView.setHasFixedSize(true); 
    layoutManager = new GridLayoutManager(this,2); 
    recyclerView.setLayoutManager(layoutManager); 
    dbHandler = new DBHandler(Favorites.this); 

    Log.d("Reading: ", "reading contacts.."); 
    ArrayList<User> users = dbHandler.getAllUsers(); 
    adapter = new UsersAdapter(users); 
    recyclerView.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
} 

}

+0

GridLayoutManager использует контекст. Так же и DatabaseHandler. В частности, 'this', который является Activity. Вы можете скопировать один и тот же шаблон в свой конструктор Adapter –

ответ

0

Пройди свой контекст при инициализации адаптера

adapter = new UsersAdapter(users,getApplicationContext()); 

и в адаптере, осуществлять эквивалентный конструктор

public UsersAdapter(ArrayList<User> mDataSet, Context context) { 
    this.context = context; 
    this.mDataSet = mDataSet; 
} 
+0

. Это помогает и разъясняет, почему моя активность в Избранное была нарушена, я не передавал контент должным образом. Спасибо. – user3591436

+0

@ user3591436 без проблем, вы можете проверить мой ответ: D –