ارسال دیتا به فرگمنت یا activity خاص از داخل آداپتر recyclerview

پرسیده شده
فعالیت 1502 روز پیش
دیده شده 764 بار
0

با سلام خدمت استاد محترم و دوستان عزیز

من طبق آموزش اطلاعات رو از api سایتم گرفتم و داخل recycler view نمایش دادم...

حالا می خوام وقتی رو هر آیتم کلیک شد id اون آیتمی که انتخاب شده رو به یک فرگمنت یا activiy دیگه ببره تا اونجا مثلا محتوای کامل مقاله یا محصول اون id رو نمایش بده

من تو کدها هر جا از intent یا fragment استفاده می کنم تو اجرای کد به مشکل می خورم...تو دیباگ هم چیزی نشون نمیده...یعنی id درست دریافت میشه ولی نه fragmenttransaction و نه intetn انجام نمیشه و Force close میده
ممنون می شم راهنمایی کنید که چطور میشه این کار رو انجام داد؟!

این کدهای بخش recycler view

package com.academyresane.myapplication;

import android.content.Intent;
import android.os.Build;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.recyclerview.widget.RecyclerView;
import com.squareup.picasso.Picasso;
import java.util.List;


public class PostListAdapter extends RecyclerView.Adapter<PostListAdapter.PostListViewHolder> {

    private List<Post> posts;
    public PostListAdapter(List<Post> posts) {
        this.posts = posts;
    }

    @NonNull
    @Override
    public PostListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new PostListViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post,parent,false));
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onBindViewHolder(@NonNull PostListViewHolder holder, int position) {
        holder.bind(posts.get(position));
    }

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

    public class PostListViewHolder extends RecyclerView.ViewHolder{
        private TextView titlePost;
        private TextView exceptPost;
        private ImageView thumbnailPost;
        public PostListViewHolder(@NonNull View itemView) {
            super(itemView);
            titlePost=itemView.findViewById(R.id.titlePost);
            exceptPost=itemView.findViewById(R.id.excerptPost);
            thumbnailPost =itemView.findViewById(R.id.postThumbnail);
        }
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public void bind(final Post post){
            titlePost.setText(post.getTitle().toString());
            exceptPost.setText(Html.fromHtml(post.getContent()));
            thumbnailPost.setClipToOutline(true);
            Picasso.get().load(post.getImgURl().toString()).into(thumbnailPost);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int idpost = post.getIdPost();
                    MainActivity mainActivity=new MainActivity();
                    Intent intent = new Intent(v.getContext(),contentActivity.class);
                    mainActivity.startActivity(intent);
                }

            });
        }
    }
}


این هم بخش mainActivity که از volly استفاده کردم
 

package com.academyresane.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.text.Html;
import android.text.Layout;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.wrapperMain,new progressFragment());
        fragmentTransaction.commit();
        StringRequest stringRequest = new StringRequest(Request.Method.GET,
                "https://hamyarezist.ir/wp-json/wp/v2/posts?_embed",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        fragmentTransaction.remove(new progressFragment());
                        ConstraintLayout progress = findViewById(R.id.conteinerProgress);
                        progress.removeAllViews();
                        try {
                            JSONArray jsonArray = new JSONArray(response);
                            List<Post> posts = new ArrayList<>();
                            for (int i = 0; i <jsonArray.length() ; i++) {
                                JSONObject postItem = jsonArray.getJSONObject(i);
                                Post post = new Post();
                                post.setTitle(postItem.getJSONObject("title").getString("rendered"));
                                post.setContent(postItem.getJSONObject("excerpt").getString("rendered"));
                                post.setImgURl(
                                        postItem.getJSONObject("_embedded")
                                        .getJSONArray("wp:featuredmedia")
                                        .getJSONObject(0)
                                        .getJSONObject("media_details")
                                        .getJSONObject("sizes")
                                        .getJSONObject("thumbnail")
                                        .getString("source_url")
                                );
                                post.setIdPost(postItem.getInt("id"));
                                posts.add(post);
                            }

                            RecyclerView recyclerView= findViewById(R.id.wrapperPostList);
                            recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,RecyclerView.VERTICAL,false));
                            recyclerView.setAdapter(new PostListAdapter(posts));
                            Log.i(TAG, "onResponse: "+response);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                fragmentTransaction.remove(new progressFragment());
                ConstraintLayout progress = findViewById(R.id.conteinerProgress);
                progress.removeAllViews();
                Log.e(TAG, "onErrorResponse: "+error.toString());
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

}

ممنونم از وقتی که برای پاسخ به این سوال میذارید...

فایل پیوست

یوسف محمدیانی
یوسف محمدیانی

3 فروردین 99

0
حذف شده

سلام،

چشمه منم متوجه نشد کجا رو اشتباه نوشتید ولی بیایین اینجوری بنویسید مث کاری که استاد قبلا انجام دادن و از interface  استفاده کنید

قسمت PostListAdapter 

package com.academyresane.myapplication;

import android.content.Intent;
import android.os.Build;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.recyclerview.widget.RecyclerView;
import com.squareup.picasso.Picasso;
import java.util.List;


public class PostListAdapter extends RecyclerView.Adapter<PostListAdapter.PostListViewHolder> {

    private List<Post> posts;
    private OnItemPostClickListener postClickListener;

  

    public void setOnItemPostClickListener(OnItemPostClickListener postClickListener) {
        this.postClickListener = postClickListener;
    }
    public PostListAdapter(List<Post> posts) {
        this.posts = posts;
    }

    @NonNull
    @Override
    public PostListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new PostListViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post,parent,false));
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onBindViewHolder(@NonNull PostListViewHolder holder, int position) {
        holder.bind(posts.get(position));
    }

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

    public class PostListViewHolder extends RecyclerView.ViewHolder{
        private TextView titlePost;
        private TextView exceptPost;
        private ImageView thumbnailPost;
        public PostListViewHolder(@NonNull View itemView) {
            super(itemView);
            titlePost=itemView.findViewById(R.id.titlePost);
            exceptPost=itemView.findViewById(R.id.excerptPost);
            thumbnailPost =itemView.findViewById(R.id.postThumbnail);
        }
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public void bind(final Post post){
            titlePost.setText(post.getTitle().toString());
            exceptPost.setText(Html.fromHtml(post.getContent()));
            thumbnailPost.setClipToOutline(true);
            Picasso.get().load(post.getImgURl().toString()).into(thumbnailPost);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int idpost = post.getIdPost();
                   if (postClickListener != null) {
                        postClickListener.itempostClick(getAdapterPosition());
                    }
                }

            });
        }
    }
  public interface OnItemPostClickListener {
        void itemPostClick(int position);
    }
	
}

 حالا هم interface مونو در MainActivity پیاده سازی میکنیم 


package com.academyresane.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.text.Html;
import android.text.Layout;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements PostListAdapter.OnItemPostClickListener {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.wrapperMain,new progressFragment());
        fragmentTransaction.commit();
        StringRequest stringRequest = new StringRequest(Request.Method.GET,
                "https://hamyarezist.ir/wp-json/wp/v2/posts?_embed",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        fragmentTransaction.remove(new progressFragment());
                        ConstraintLayout progress = findViewById(R.id.conteinerProgress);
                        progress.removeAllViews();
                        try {
                            JSONArray jsonArray = new JSONArray(response);
                            List<Post> posts = new ArrayList<>();
                            for (int i = 0; i <jsonArray.length() ; i++) {
                                JSONObject postItem = jsonArray.getJSONObject(i);
                                Post post = new Post();
                                post.setTitle(postItem.getJSONObject("title").getString("rendered"));
                                post.setContent(postItem.getJSONObject("excerpt").getString("rendered"));
                                post.setImgURl(
                                        postItem.getJSONObject("_embedded")
                                        .getJSONArray("wp:featuredmedia")
                                        .getJSONObject(0)
                                        .getJSONObject("media_details")
                                        .getJSONObject("sizes")
                                        .getJSONObject("thumbnail")
                                        .getString("source_url")
                                );
                                post.setIdPost(postItem.getInt("id"));
                                posts.add(post);
                            }

                            RecyclerView recyclerView= findViewById(R.id.wrapperPostList);
                            recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,RecyclerView.VERTICAL,false));
                            recyclerView.setAdapter(new PostListAdapter(posts));
                            Log.i(TAG, "onResponse: "+response);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                fragmentTransaction.remove(new progressFragment());
                ConstraintLayout progress = findViewById(R.id.conteinerProgress);
                progress.removeAllViews();
                Log.e(TAG, "onErrorResponse: "+error.toString());
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }
   @Override
   public onItemPostClick(int position){
	Log.i(TAG, "onResponse: "+position);
	//الان اینجا موقعیت پستت رو داری  و می تونی چیزی که مد نظرته رو انجام بدی

}

در مورد Fragment داخل Adapter هم قبلا یکی از بچه ها پرسید هرکاری کردم نشد، بعد متوجه شدم اصلا چنین کاری معقول و خوب نیست وبهترین (از اینایی که خوندم) همین interface هست

فیلم

فایل پیوست

مهرداد

توسط

مهرداد

3 فروردین 99

0
حذف شده

ممنونم آقا مهرداد...
من این روش رو قبلا امتحان کردم...جواب نگرفتم متاسفانه

ولی در نهایت تونستم از داخل آداپتر ارسال دیتا به اکتیوی داشته باشم به لطف putExtra 

مباحث ارتباط با سرور خیلی گسترده است به نظرم بهتره به عنوان یه پروژه پایان دوره ارتباط با api یک سایت فروشگاهی و خبری وردپرسی (از این نظر که api تقریبا کاملی داره) روش پیاده سازیش رو توضیح بدن...

من به شخصه به شدت بحث ارتباط با سرور برام خیلی مهمه ....ولی مثال هایی که حل شده در این دوره خیلی نیازم رو نتونسته برطرف کنه

استاد شاهینی عزیز 
اگر راهنمایی به نظرتون میرسه ممنون میشم بفرمایید

فایل پیوست

یوسف محمدیانی

توسط

یوسف محمدیانی

4 فروردین 99

حذف شده
خواهش میکنم، قبلا چرا جواب نگرفتین ؟ متوجه نشدین مشکلش چی بود ؟ ( قبلا ظاهرا داخل آداپتر مستقیم می فرستادن ولی الان میگن interface کارایی بهتری داره و قابل فهم تره)
مهرداد

4 فروردین 99

حذف شده
چرا ...متوجه شدم... مشکل از این بود که موقع نوشتن intent ، کانتکس رو درست تعریف نمی کردم... چون کدهامون تو اول یادگیری خیلی نامنظم و غیر استاندارد هست بوجود اومدن این مشکلات طبیعیه
یوسف محمدیانی

5 فروردین 99

حذف شده
دقیقامنم همین مشکل کم تجربگی رو دارم بعضی وقتا...ولی سعی کنین با همون انجام بدید چون بهترین و خوانا ترین روشه تا الان
مهرداد

5 فروردین 99