如何使用适配器启动一个新的 Intent?
How to start a new Intent by using an Adapter?
CategoriesListScreen.java
public class CategoriesListScreen extends AppCompatActivity
{
private static final String TAG = "CategoriesListScreen";
//vars
private ArrayList<String> mNames = new ArrayList<>();
private ArrayList<String> mImageUrls = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getImages();
}
private void getImages(){
Log.d(TAG, "initImageBitmaps: preparing bitmaps.");
mImageUrls.add("https://c1.staticflickr.com/5/4636/25316407448_de5fbf183d_o.jpg");
mNames.add("Havasu Falls");
mImageUrls.add("https://i.redd.it/tpsnoz5bzo501.jpg");
mNames.add("Trondheim");
mImageUrls.add("https://i.redd.it/qn7f9oqu7o501.jpg");
mNames.add("Portugal");
mImageUrls.add("https://i.redd.it/j6myfqglup501.jpg");
mNames.add("Rocky Mountain National Park");
mImageUrls.add("https://i.redd.it/0h2gm1ix6p501.jpg");
mNames.add("Mahahual");
mImageUrls.add("https://i.redd.it/k98uzl68eh501.jpg");
mNames.add("Frozen Lake");
mImageUrls.add("https://i.redd.it/glin0nwndo501.jpg");
mNames.add("White Sands Desert");
mImageUrls.add("https://i.redd.it/obx4zydshg601.jpg");
mNames.add("Austrailia");
mImageUrls.add("https://i.imgur.com/ZcLLrkY.jpg");
mNames.add("Washington");
initRecyclerView();
}
private void initRecyclerView(){
Log.d(TAG, "initRecyclerView: init recyclerview");
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(layoutManager);
MyAdapter adapter = new MyAdapter(this, mNames, mImageUrls);
recyclerView.setAdapter(adapter);
}
我有 RecyclerView 适配器:
MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
{
private ArrayList<String> mNames = new ArrayList<>();
private ArrayList<String> mImageUrl = new ArrayList<>();
private Context mContext;
public MyAdapter(Context mContext, ArrayList<String> names, ArrayList<String> mImageUrl) {
this.mNames = names;
this.mImageUrl = mImageUrl;
this.mContext = mContext;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position)
{
//as the user clicks on different images activity correspond to that image should start.
Glide.with(mContext)
.asBitmap()
.load(mImageUrl.get(position))
.into(holder.); //i am confused what to write here..
holder.onBind(position);
}
@Override
public int getItemCount() {
return mImageUrl.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public MyViewHolder(View itemView)
{
super(itemView);
CircleImageView image;
TextView textView;
image = (CircleImageView) itemView.findViewById(R.id.image_view);
textView = (TextView) itemView.findViewById(R.id.name);
image.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(getAdapterPosition()){
case 0:
// start activity 0
Intent intent = new Intent(mContext, MainActivity.class);
mContext.startActivity(intent);
break;
case 1:
// start activity 1
Intent intent2 = new Intent(mContext, CarsActivity.class);
mContext.startActivity(intent2);
break;
}
}
}
}
我想设置水平 recyclerview,我需要启动一个与图像对应的新 Intent activity。例如,如果用户点击第一张图片,那么他应该被重定向到 first.class,如果用户点击第二张图片,那么他应该被重定向到 second.class 等等。
我很迷茫。我不知道在 onBindViewHolder 里面写什么。任何帮助,将不胜感激! :)
layout_listitem.xml
<android.support.v7.widget.CardView
android:layout_width="120dp"
android:layout_height="120dp"
app:cardCornerRadius="4dp"
app:cardMaxElevation="2dp"
app:cardElevation="1dp"
android:layout_centerInParent="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="90dp"
android:layout_height="90dp"
android:scaleType="centerCrop"
android:layout_centerHorizontal="true"
android:id="@+id/image_view"
android:src="@drawable/ic_launcher_background"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="20dp"
android:text="Canada"
android:layout_below="@+id/image_view"
android:id="@+id/name"
android:layout_centerHorizontal="true"
android:gravity="center"
android:layout_marginTop="5dp"
android:textColor="#000"
android:layout_marginBottom="5dp"
android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="8sp"
android:autoSizeMaxTextSize="15sp"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position)
{
holder.onBind(mImageUrl.get(position), mNames.get(position));
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
CircleImageView imageView; // <-- move image here
TextView textView;
public MyViewHolder(View itemView)
{
super(itemView);
imageView = (CircleImageView) itemView.findViewById(R.id.image_view);
textView = (TextView) itemView.findViewById(R.id.name);
imageView.setOnClickListener(this);// <-- only this line is added to constructor
}
@Override
public void onClick(View v) {//here ViewHolder implements OnClickListener
final Context ctx = v.getContext();
Intent intent;
switch(getAdapterPosition){
case 0:
intent = new Intent(ctx, FirstActivity.class);
ctx.startActivity(intent);
break;
case 1:
intent = new Intent(ctx, SecondActivity.class);
ctx.startActivity(intent);
break
}
}
void onBind(String url, String name){ // call this method from onBindViewHolder
textView.setText(name);
Glide.with(imageView.getContext())
.asBitmap()
.load(url)
.into(imageView);
}
}
onBindViewHolder 将元素位置作为第二个参数,对于此解决方案,您显然需要始终知道列表中每个位置的每个不同对象的位置始终相同
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position)
{
..
switch(position)
{
case 0:
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, FirstClass.class);
context.startActivity(intent);
}
});
break;
case 1:
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, SecondClass.class);
context.startActivity(intent);
}
});
break
}
}
CategoriesListScreen.java
public class CategoriesListScreen extends AppCompatActivity
{
private static final String TAG = "CategoriesListScreen";
//vars
private ArrayList<String> mNames = new ArrayList<>();
private ArrayList<String> mImageUrls = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getImages();
}
private void getImages(){
Log.d(TAG, "initImageBitmaps: preparing bitmaps.");
mImageUrls.add("https://c1.staticflickr.com/5/4636/25316407448_de5fbf183d_o.jpg");
mNames.add("Havasu Falls");
mImageUrls.add("https://i.redd.it/tpsnoz5bzo501.jpg");
mNames.add("Trondheim");
mImageUrls.add("https://i.redd.it/qn7f9oqu7o501.jpg");
mNames.add("Portugal");
mImageUrls.add("https://i.redd.it/j6myfqglup501.jpg");
mNames.add("Rocky Mountain National Park");
mImageUrls.add("https://i.redd.it/0h2gm1ix6p501.jpg");
mNames.add("Mahahual");
mImageUrls.add("https://i.redd.it/k98uzl68eh501.jpg");
mNames.add("Frozen Lake");
mImageUrls.add("https://i.redd.it/glin0nwndo501.jpg");
mNames.add("White Sands Desert");
mImageUrls.add("https://i.redd.it/obx4zydshg601.jpg");
mNames.add("Austrailia");
mImageUrls.add("https://i.imgur.com/ZcLLrkY.jpg");
mNames.add("Washington");
initRecyclerView();
}
private void initRecyclerView(){
Log.d(TAG, "initRecyclerView: init recyclerview");
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(layoutManager);
MyAdapter adapter = new MyAdapter(this, mNames, mImageUrls);
recyclerView.setAdapter(adapter);
}
我有 RecyclerView 适配器:
MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
{
private ArrayList<String> mNames = new ArrayList<>();
private ArrayList<String> mImageUrl = new ArrayList<>();
private Context mContext;
public MyAdapter(Context mContext, ArrayList<String> names, ArrayList<String> mImageUrl) {
this.mNames = names;
this.mImageUrl = mImageUrl;
this.mContext = mContext;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position)
{
//as the user clicks on different images activity correspond to that image should start.
Glide.with(mContext)
.asBitmap()
.load(mImageUrl.get(position))
.into(holder.); //i am confused what to write here..
holder.onBind(position);
}
@Override
public int getItemCount() {
return mImageUrl.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public MyViewHolder(View itemView)
{
super(itemView);
CircleImageView image;
TextView textView;
image = (CircleImageView) itemView.findViewById(R.id.image_view);
textView = (TextView) itemView.findViewById(R.id.name);
image.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(getAdapterPosition()){
case 0:
// start activity 0
Intent intent = new Intent(mContext, MainActivity.class);
mContext.startActivity(intent);
break;
case 1:
// start activity 1
Intent intent2 = new Intent(mContext, CarsActivity.class);
mContext.startActivity(intent2);
break;
}
}
}
}
我想设置水平 recyclerview,我需要启动一个与图像对应的新 Intent activity。例如,如果用户点击第一张图片,那么他应该被重定向到 first.class,如果用户点击第二张图片,那么他应该被重定向到 second.class 等等。 我很迷茫。我不知道在 onBindViewHolder 里面写什么。任何帮助,将不胜感激! :)
layout_listitem.xml
<android.support.v7.widget.CardView
android:layout_width="120dp"
android:layout_height="120dp"
app:cardCornerRadius="4dp"
app:cardMaxElevation="2dp"
app:cardElevation="1dp"
android:layout_centerInParent="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="90dp"
android:layout_height="90dp"
android:scaleType="centerCrop"
android:layout_centerHorizontal="true"
android:id="@+id/image_view"
android:src="@drawable/ic_launcher_background"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="20dp"
android:text="Canada"
android:layout_below="@+id/image_view"
android:id="@+id/name"
android:layout_centerHorizontal="true"
android:gravity="center"
android:layout_marginTop="5dp"
android:textColor="#000"
android:layout_marginBottom="5dp"
android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="8sp"
android:autoSizeMaxTextSize="15sp"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position)
{
holder.onBind(mImageUrl.get(position), mNames.get(position));
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
CircleImageView imageView; // <-- move image here
TextView textView;
public MyViewHolder(View itemView)
{
super(itemView);
imageView = (CircleImageView) itemView.findViewById(R.id.image_view);
textView = (TextView) itemView.findViewById(R.id.name);
imageView.setOnClickListener(this);// <-- only this line is added to constructor
}
@Override
public void onClick(View v) {//here ViewHolder implements OnClickListener
final Context ctx = v.getContext();
Intent intent;
switch(getAdapterPosition){
case 0:
intent = new Intent(ctx, FirstActivity.class);
ctx.startActivity(intent);
break;
case 1:
intent = new Intent(ctx, SecondActivity.class);
ctx.startActivity(intent);
break
}
}
void onBind(String url, String name){ // call this method from onBindViewHolder
textView.setText(name);
Glide.with(imageView.getContext())
.asBitmap()
.load(url)
.into(imageView);
}
}
onBindViewHolder 将元素位置作为第二个参数,对于此解决方案,您显然需要始终知道列表中每个位置的每个不同对象的位置始终相同
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position)
{
..
switch(position)
{
case 0:
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, FirstClass.class);
context.startActivity(intent);
}
});
break;
case 1:
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, SecondClass.class);
context.startActivity(intent);
}
});
break
}
}