如何使用适配器启动新的Intent?

问题描述 投票:-1回答:2

categories list screen.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适配器:

my adapter.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活动。例如,如果用户点击第一张图像,那么他应该被重定向到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>
android android-recyclerview adapter android-arrayadapter recycler-adapter
2个回答
1
投票
@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); 
        }
    }

0
投票

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.