>source

맞춤 장소 개체 및 장소 어댑터를 만들었습니다. Parcelable을 사용했지만 조각의 항목을 클릭해도 아무런 변화가 없습니다

소포 가능을 사용하려고했으나 항목을 클릭해도 응답이 없습니다.

장소 개체

public class Place implements Parcelable {

/** String resource ID for the name of the place */
private int mPlaceID;
private int mImageResourceId;
private int mNearestStation;
private int mSiteInfo;
public Place(int placeID, int imageResourceId, int NearestStation, int 
SiteInfo) {
    mPlaceID = placeID;
    mImageResourceId = imageResourceId;
    mNearestStation = NearestStation;
    mSiteInfo = SiteInfo;
}
protected Place(Parcel in) {
    mImageResourceId = in.readInt();
    mPlaceID = in.readInt ();
    mNearestStation = in.readInt ();
    mSiteInfo = in.readInt ();
}
public static final Creator<Place> CREATOR = new Creator<Place>() {
    @Override
    public Place createFromParcel(Parcel in) {
        return new Place (in);
    }
    @Override
    public Place[] newArray(int size) {
        return new Place[size];
    }
};
/**
 * Get the string resource ID for the name of the place.
 */
public int getPlaceName() {
    return mPlaceID;
}
/**
 * Return the image resource ID of the place.
 */
public int getImageResourceId() {
    return mImageResourceId;
}
public int getNearestStation() {
    return mNearestStation;
}
public int getSiteInfo() {
    return mSiteInfo;
}
@Override
public int describeContents() {
    return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeInt(mImageResourceId);
    parcel.writeInt(mPlaceID);
    parcel.writeInt ( mNearestStation );
    parcel.writeInt ( mSiteInfo );
}
}

장소 어댑터

public class PlaceAdapter extends 
RecyclerView.Adapter<PlaceAdapter.PlaceViewHolder> {
Context mContext;
List<Place> mData;
public static class PlaceViewHolder extends RecyclerView.ViewHolder{
    public TextView mTextView;
    public ImageView mImageView;
    public PlaceViewHolder(@NonNull View itemView) {
        super ( itemView );
        mTextView = itemView.findViewById ( R.id.ImageViewText );
        mImageView = itemView.findViewById ( R.id.ImageView );
    }
}
public PlaceAdapter(Context mContext, List<Place> mData){
    this.mContext = mContext;
    this.mData = mData;
}
@NonNull
@Override
public PlaceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int 
viewType) {
    View v = LayoutInflater.from ( mContext ).inflate ( 
R.layout.list_item, parent, false );
    PlaceViewHolder pvh = new PlaceViewHolder ( v );
    return pvh;
}
@Override
public void onBindViewHolder(@NonNull PlaceViewHolder holder, int 
position) {

    holder.mTextView.setText ( mData.get ( position ).getPlaceName () );
    holder.mImageView.setImageResource ( mData.get ( position 
).getImageResourceId () );
}
@Override
public int getItemCount() {
    return mData.size ();
}
public interface OnPlaceListener{
    void onPlaceClick(int position);
}
}

항목을 클릭하는 조각 중 하나입니다

public class MonumentsFragment extends Fragment implements 
PlaceAdapter.OnPlaceListener {
private RecyclerView mRecyclerView;
public MonumentsFragment() {
    // Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate( R.layout.places_list, container, 
false);

    final List<Place> places = new ArrayList<> ();
    Place place1 = new Place(R.string.monument1, 
R.drawable.windsor_castle, R.string.monument1S, R.string.monument1I);
    places.add(place1);
    Place place2 = new Place(R.string.monument2, 
R.drawable.trafalgar_square,R.string.monument2S, R.string.monument2I);
    places.add(place2);
    Place place3 = new Place(R.string.monument3, 
R.drawable.buckingham_palace,R.string.monument3S, R.string.monument3I);
    places.add(place3);
    Place place4 = new Place(R.string.monument4, 
R.drawable.bank_of_england,R.string.monument4S, R.string.monument4I);
    places.add(place4);
    Place place5 = new Place(R.string.monument5, 
R.drawable.kensington_palace,R.string.monument5S, R.string.monument5I);
     places.add(place5);
    Place place6 = new Place(R.string.monument6, 
R.drawable.london_wall,R.string.monument6S, R.string.monument6I);
    places.add(place6);

    mRecyclerView = (RecyclerView) rootView.findViewById ( 
R.id.recycler_view );
    PlaceAdapter placeAdapter = new PlaceAdapter ( getContext (), places 
);
    mRecyclerView.setLayoutManager ( new LinearLayoutManager ( getActivity 
() ) );
    mRecyclerView.setAdapter ( placeAdapter );
    return rootView;

}
@Override
public void onPlaceClick(int position) {
    Intent intent = new Intent( MonumentsFragment.this.getActivity () 
,SelectedPlaceActivity.class );
    intent.putExtra("Place Item", position);
    startActivity ( intent );
}

}

이것은 클릭하면 열려는 활동입니다

public class SelectedPlaceActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView( R.layout.selected_place);
    Intent intent = getIntent();
    if (intent!=null) {
        Place currentPlace = intent.getParcelableExtra("Place Item");

        int imageRes = currentPlace.getImageResourceId ();
        int placeName = currentPlace.getPlaceName ();
        int nearestStation = currentPlace.getNearestStation ();
        int moreInfo = currentPlace.getSiteInfo ();
        ImageView placeImage = findViewById (R.id.selected_place_image );
        TextView namePlace = findViewById ( R.id.selected_place_name );
        TextView station = findViewById ( R.id.nearest_station );
        TextView information = findViewById ( R.id.more_info );

        placeImage.setImageResource(imageRes);
        namePlace.setText(placeName);
        station.setText(nearestStation);
        information.setText ( moreInfo );
    }
}
}

조각의 항목을 클릭해도 응답이 없습니다

  • 답변 # 1

    onClick 에 리스너를 지정하지 않았습니다.  리스너를 어댑터의 생성자에 전달했습니다. 아래 단계를 따르십시오.

    1 단계 PlaceAdapter 에서 리스너 선언  아래 주어진대로 생성자를 통해 전달하여 값을 할당하십시오.

    // declare the listener
    OnPlaceListener mListener;
    // pass the listener along with Context and the List
    public PlaceAdapter(Context mContext, List<Place> mData, OnPlaceListener listener){
        this.mContext = mContext;
        this.mData = mData;
        // assign the listener
        this.mListener = listener;
    }
    
    

    2 단계 onBindViewHolder 내부의 itemView onClick에 리스너를 할당해야합니다.  방법

    @Override
    public void onBindViewHolder(@NonNull PlaceViewHolder holder, int
            position) {
        // assign the listener here
        holder.itemView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(final View v) {
                mListener.onPlaceClick(position);
            }
        });
        holder.mTextView.setText ( mData.get ( position ).getPlaceName () );
        holder.mImageView.setImageResource ( mData.get ( position
        ).getImageResourceId () );
    }
    
    

    3 단계 프래그먼트에서 리스너를 어댑터에 전달하십시오.

    PlaceAdapter placeAdapter = new PlaceAdapter(getContext(), places, this);
    
    

    또한, 포지티브를 의도로 전달한다고 언급했습니다. 대신 해당 위치와 관련된 장소 개체를 전달해야합니다

    @Override
    public void onPlaceClick(int position) {
        Intent intent = new Intent( MonumentsFragment.this.getActivity ()
                ,SelectedPlaceActivity.class );
        intent.putExtra("Place Item", places.get(position));
        startActivity ( intent );
    }
    
    

    참고목록을 선언해야합니다. onCreateView   onPlaceClick 에서 액세스  방법.

    public class MonumentsFragment extends Fragment implements
            PlaceAdapter.OnPlaceListener {
        private RecyclerView mRecyclerView;
        // Declare the list here
        private List<Place> places;
        public MonumentsFragment() {
            // Required empty public constructor
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate( R.layout.places_list, container,
                    false);
            // initialize the list 
            places = new ArrayList<>();
            Place place1 = new Place(R.string.monument1, 
                                     R.drawable.windsor_castle, R.string.monument1S, R.string.monument1I);
            places.add(place1);
            // rest of the code
    
    

  • 답변 # 2

    RecyclerView 에서 항목을 클릭하려면  당신은 setOnClickListener 를 제공해야합니다  품목에. 예를 들어, onCreateViewHolder 에서 할 수 있습니다  어댑터의.

    public ExampleAdapter.ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.example_item, viewGroup, false);
        final ExampleViewHolder holder = new ExampleViewHolder(view);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // actions that you need to perform
            }
        });
        return holder;
    }
    
    

    아이템 위치를 원하면 holder.getAdapterPosition() 를 사용할 수 있습니다  그것을 위해. 추가 설명이 필요한 경우 필요한 결과에 대한 자세한 내용을 제공하십시오.

    내부 인터페이스를 사용하는 경우 listener.onPlaceClick(holder.getAdapterPosition()) 를 사용할 수 있습니다  새 활동을 열거 나 어댑터 내부에 코드를 넣고 mData.get() 를 사용하는 데 필요한 메소드를 대체하십시오.   intent 에 대한 개체를 얻을 수 . 당신은 context 를 얻을 수 있습니다   v 에서 .

    --- 업데이트 ---

    RecyclerViewAdapter 에서 활동을 시작하려면  컨텍스트를 전달해야합니다. 두 가지 방법이 있습니다. View 에서 얻을 수 있습니다.  또는 생성자에 컨텍스트를 할당하십시오.

    holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
          public void onClick(View v) {
              Intent intent = new Intent (v.getContext(), *needed_activity_class*);
              // put all that you need in intent
              v.getContext().startActivity(intent);
          }
     });
    
    

관련 자료

  • 이전 arrays - Java는 목록에서 최상위 n 개의 인덱스를 찾습니다
  • 다음 amazon web services - EC2 인스턴스에서 S3 버킷을 드라이브로 마운트하면 파일이 버킷에 복사 붙여 넣기 또는 직접 저장됩니까?