簡體   English   中英

如何在片段到適配器之間傳遞數據

[英]how can pass data between fragment to adapter

查看有關此內容的所有文章,並在所有情況下都可以理解,人們解釋了如何通過接口將數據從適配器傳遞到片段,但我使用的是,如何將數據從片段傳遞到適配器? 以及如何傳遞這些數據的價值?

這是我的適配器:

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
    private Context context;
    List<jsonContent> jcontent;
    private AdapterCallback callback;
    private String etpass;


    public DataAdapter(Context context, List<jsonContent> jcontent, AdapterCallback callback) {

        this.context=context;
        this.jcontent=jcontent;
        this.callback=callback;

    }

    @Override
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

       View view ;
        if(i == R.layout.card_row) {
            view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false);
        }else {
            view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.button_card, viewGroup, false);
        }
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int i) {

        if(i == jcontent.size()) {

            viewHolder.buttonnext.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    jcontent.removeAll(jcontent);
                    callback.MethodCallbacknext();

                }
            });
            viewHolder.buttonprev.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    jcontent.removeAll(jcontent);
                    callback.MethodCallbackprev();

                }
            });
            viewHolder.go.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    etpass=String.valueOf(viewHolder.editText.getText());
                    maghalat f1 = new maghalat ();
                    Bundle args1 = new Bundle();
                    args1.putString("sag",etpass);
                    f1.setArguments(args1);
                    callback.MethodCallbackgo();
                }
            });

            viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });

            viewHolder.pages.setText(Integer.toString(jcontent.get(i - 1).pages));


        }
        else {
            viewHolder.title.setText(jcontent.get(i).title);
            viewHolder.title.setTypeface(viewHolder.title.getTypeface(), Typeface.BOLD);
            Picasso.with(context).load(jcontent.get(i).imgurl).resize(300, 400).into(viewHolder.imageView);
        }
    }
    @Override
    public int getItemCount() {
            return jcontent.size()+1;
    }

    @Override
    public int getItemViewType(int position) {
        return (position == jcontent.size()) ? R.layout.button_card : R.layout.card_row;
    }


    public class ViewHolder extends RecyclerView.ViewHolder{

        private TextView title,pages,current;

        private ImageView imageView;

        private Button buttonnext,buttonprev,go;

        private CardView cardView;

        private EditText editText;



        public ViewHolder(final View view) {
            super(view);



           title = (TextView)view.findViewById(R.id.post_title);
            imageView=(ImageView)view.findViewById(R.id.img);

            buttonnext =(Button)view.findViewById(R.id.next);
            buttonprev=(Button)view.findViewById(R.id.prev);
            go=(Button)view.findViewById(R.id.go);

            editText=(EditText)view.findViewById(R.id.et_go_page);

            cardView=(CardView)view.findViewById(R.id.cvv);

            pages=(TextView)view.findViewById(R.id.number_pages);
            current=(TextView)view.findViewById(R.id.current);
}
}
}

這是我的界面:

public interface AdapterCallback {
    void MethodCallbackgo();
    void MethodCallbacknext();
    void MethodCallbackprev();
}

這是我的片段:

public class maghalat extends Fragment {

    private View myFragmentView;
    private RecyclerView recyclerView;
    private DataAdapter adapter;
    private String TAG = MainActivity.class.getSimpleName();
    private ProgressDialog pDialog;
    List<jsonContent> listcontent=new ArrayList<>();

    public int dog=1;
    public String url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myFragmentView = inflater.inflate(R.layout.maghalat, container, false);


        if(isNetworkConnected()) {
            asyncRun();
        }else
        {
            Toast.makeText(getActivity().getApplicationContext(), "دستگاه شما به اینترنت متصل نیست!", Toast.LENGTH_LONG).show();
        }
        return myFragmentView;
    }
    public void asyncRun(){
       new GetContacts().execute();
    }
    public class GetContacts extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            HttpHandler sh = new HttpHandler();


            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url);


            Log.e(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {

                    JSONObject jsonObj = new JSONObject(jsonStr);


                    int id=jsonObj.getInt("pages");


                    JSONArray posts = jsonObj.getJSONArray("posts");
                    for (int i = 0; i < posts.length(); i++) {
                        JSONObject c = posts.getJSONObject(i);

                        jsonContent jsonContent=new jsonContent();

                        jsonContent.title=c.getString("title");

                        //img
                        JSONObject post_img=c.getJSONObject("thumbnail_images");
                        for (int j=0;j<post_img.length();j++)
                        {
                            JSONObject v=post_img.getJSONObject("mom-portfolio-two");
                            jsonContent.imgurl=v.getString("url");
                        }
                        jsonContent.pages=id;
                        listcontent.add(jsonContent);

                    }

                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getActivity().getApplicationContext(),
                                    "Json parsing error: " + e.getMessage(),
                                    Toast.LENGTH_LONG)
                                    .show();
                        }
                    });
                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getActivity().getApplicationContext(),
                                "Couldn't get json from server. Check LogCat for possible errors!",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            pDialog.dismiss();
            recyclerView=(RecyclerView)myFragmentView.findViewById(R.id.recycler_view);
            recyclerView.setHasFixedSize(true);
            RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
            recyclerView.setLayoutManager(layoutManager);

            adapter=new DataAdapter(getActivity(), listcontent, new AdapterCallback() {
                @Override
                public void MethodCallbackgo() {
                    String gg;
                    Bundle extras = getArguments();
                    gg = extras.getString("sag");
                    dog= Integer.parseInt(gg);
                    url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
                    new GetContacts().execute();
                }

                @Override
                public void MethodCallbacknext() {
                    dog+=1;
                    url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
                    new GetContacts().execute();
                }

                @Override
                public void MethodCallbackprev() {
                    if (dog!=1)
                    {
                        dog-=1;
                        url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
                        new GetContacts().execute();
                    }else{
                        Toast.makeText(getActivity().getApplicationContext(),"این اولین صفحه است",Toast.LENGTH_SHORT).show();
                    }
                }
            });

            recyclerView.setAdapter(adapter);
        }
    }



    private boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni == null) {
            // There are no active networks.
            return false;
        } else
            return true;
    }
   }

想要在go.setOnClickListener適配器內部獲取編輯文本值,並將其傳遞到public void MethodCallbackgo() {片段,但是沒有用。 另一個問題是如何將片段中的狗變量值發送到適配器?

如果正確理解,則希望將數據從回調方法調用傳遞到接口實現。

使用參數

void MethodCallbackgo(String data);

傳回

etpass=String.valueOf(viewHolder.editText.getText());
callback.MethodCallbackgo(etpass);

另外:建議重寫AsyncTask以將URL作為參數。 該URL不必是您的Fragment的成員變量

 @Override
public void MethodCallbackgo(String data) {
    // here you have data 
    //use it ...
    new GetContacts().execute(url); // pass url here, for example 
}

這只會創建一個從未顯示過的全新片段,什么也不會做

maghalat f1 = new maghalat ();
Bundle args1 = new Bundle();
args1.putString("sag",etpass);
f1.setArguments(args1);

就我個人而言,我認為適配器不應該控制頁碼。 Fragment(或其他一些類)應包含上一個/下一個/轉到按鈕操作,並相應地更新適配器。 您已經給類“太多的責任”,其唯一目的是在列表中顯示數據。

在適配器中聲明

private AdapterCallback mAdaptercallback;

在適配器中創建一種方法

public void setAdapterCallback(AdapterCallback  adaptercallback){
    this.mAdaptercallback = adaptercallback;
}

在你的片段中這樣做

    adapter.setAdapterCallback(new DataAdapter.AdapterCallback() {


          @Override
            public void MethodCallbackgo() {
                String gg;
                Bundle extras = getArguments();
                gg = extras.getString("sag");
                dog= Integer.parseInt(gg);
                url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
                new GetContacts().execute();
            }

            @Override
            public void MethodCallbacknext() {
                dog+=1;
                url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
                new GetContacts().execute();
            }

            @Override
            public void MethodCallbackprev() {
                if (dog!=1)
                {
                    dog-=1;
                    url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_posts";
                    new GetContacts().execute();
                }else{
                    Toast.makeText(getActivity().getApplicationContext(),"این اولین صفحه است",Toast.LENGTH_SHORT).show();
                }
            }
        });

我希望這能解決您的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM