简体   繁体   中英

Open new activity from Recyclerview containing cards

Have an apparently simple task of -

Display a list of items using recycler view and each item should be card view.On click of any item new screen should open which shows detail of that item.

I already have seen various questions posted on the same topic, I would appreciate a little help on the attempt ive made rather than redirecting me there, since I'm pretty new and unable to understand how exactly to implement just by seeing those answers.I have tried to follow a tutorial closely but clearly have failed in replicating the results.HERE ARE THE FILES

MainActivity.java

. package com.example.hardikvats.recylerviewdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private String[] phones={"MotoX","Nokia Asha","Lumia 710","Iphone 7s"};
    private String[] OperatingSytem={"Android","Symbian","Windows","Ios"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        RecyclerView recyclerView= (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        MyAdapter adapter=new MyAdapter(this,phones);
        recyclerView.setAdapter(adapter);

    }


    }

MyAdapter.java

import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Hardik Vats on 20-Jan-17.
 */

public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
    Context c;
    String[] phones;
    String[] OperatingSystem;
    //CONSTRUCTOR
    public MyAdapter(Context c, String[] PhoneModel){
        this.c=c;
        this.phones=PhoneModel;
        //this.OperatingSystem=OperatingSystem;
    }
    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //INFLATING FROM XML TO JAVA VIEW
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,null);

        MyHolder holder=new MyHolder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {
holder.PhoneModel.setText(phones[position]);
holder.setItemClickListner(new ItemClickListner() {
    @Override
    public void onItemClick(View v, int position) {
        Intent i=new Intent(c,DetailActivity.class);
        i.putExtra("OS name",OperatingSystem[position]);
    }
});
    }

    @Override
    public int getItemCount() {
        return phones.length;
    }

}

MyHolder.java

   import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;

/**
 * Created by Hardik Vats on 20-Jan-17.
 */

public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    TextView PhoneModel;
     ItemClickListner icl;
    public MyHolder(View itemView) {
        super(itemView);
        PhoneModel=(TextView) itemView.findViewById(R.id.MobilePhone);
itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
this.icl.onItemClick(v,getLayoutPosition());
    }
public void setItemClickListner(ItemClickListner itemClickListner){
        this.icl=itemClickListner;
    }
}

DetailActivity.java

     import android.content.Intent;

    import android.os.Bundle;

    import android.support.v7.app.AppCompatActivity;

    import android.widget.TextView;
    public class DetailActivity extends AppCompatActivity {
        TextView OperatingSystem;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_detail2);
            Intent i=getIntent();
            final String OperatingSystem =i.getExtras().getString("Operating System");


        }
    }

ItemClickListner.java(Interface)

`import android.view.View;

    /**
     * Created by Hardik Vats on 20-Jan-17.
     */

    public interface ItemClickListner {
        void onItemClick(View v, int position);
    }`

The goal is to click each list item from phones array and get an activity listing the OS in a new activity in a new textfield

在i.putExtra(“ OS NAME ....之后,添加此行

c.startActivity(c,DetailActivity.class);

As you did, in order that changes to be small, try this:

holder.PhoneModel.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i=new Intent(c,DetailActivity.class);
        i.putExtra("OS name",OperatingSystem[holder.getAdapterPosition()]);
    }
});

Holder will always retain your position.

//set on item click listener like this 

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(MainActivity.this, "Card at " + position + " is clicked", Toast.LENGTH_SHORT).show();

// here you can start your detail Activity
 Intent i=new Intent(c,DetailActivity.class);
        i.putExtra("OS name",OperatingSystem[position]);
c.startActivity(i);


            }
        }));

// here is the on item click listener class 

public class RecyclerItemClickListener  implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;
    GestureDetector mGestureDetector;


    public interface OnItemClickListener{
        public void onItemClick(View view, int position);
    }


    public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
        mListener = listener;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        View childView = rv.findChildViewUnder(e.getX(),e.getY());
        if(childView != null && mListener != null && mGestureDetector.onTouchEvent(e)){
            mListener.onItemClick(childView, rv.getChildAdapterPosition(childView));
            return true;
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override`enter code here`
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM