💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ یوسف محمدیانی
ارسال دیتا به فرگمنت یا activity خاص از داخل آداپتر recyclerview
جامعه جاوا (اندروید) ایجاد شده در ۰۳ فروردین ۱۳۹۹

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

من طبق آموزش اطلاعات رو از 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);
    }
}

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

سلام،

چشمه منم متوجه نشد کجا رو اشتباه نوشتید ولی بیایین اینجوری بنویسید مث کاری که استاد قبلا انجام دادن و از 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 هست

فیلم

مهرداد ۰۳ فروردین ۱۳۹۹، ۲۱:۵۹

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

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

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

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

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

یوسف محمدیانی ۰۴ فروردین ۱۳۹۹، ۱۸:۴۱