0

все сообщения об этом и понять во всех случаях люди объясняют, что передают данные из адаптера в фрагмент с интерфейсом, и я использую это, но мой вопрос заключается в том, как передать данные из фрагмента в адаптер? и как можно передавать данные из этих данных?как передать данные между фрагментом в адаптер

это мой адаптер:

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() {, но не работает. и еще один вопрос: как отправить значение переменной собаки внутри фрагмента на адаптер?

+0

Непонятно, почему t он имеет обратные вызовы. Фрагмент должен иметь следующую и предыдущую кнопки. Все, что нужно сделать адаптеру - это отобразить данные –

+0

для изменения значения переменной dog в фрагменте. и ваш ответ не отвечает на мой вопрос – erfan

+0

Это комментарий. Не ответ. Его рекомендуется не давать ответов в комментариях –

ответ

1

Если оно правильно понимает, вы хотите передать данные из вызова метода обратного вызова в реализацию интерфейса.

Используйте параметры

void MethodCallbackgo(String data); 

Pass его обратно

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

также: предложение переписать AsyncTask взять URL в качестве параметра. URL не должен быть переменным членом вашего фрагмента

@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); 

Лично я дон Не думаю, что адаптер должен контролировать номер страницы. Фрагмент (или только какой-либо другой класс) должен содержать действия предыдущей/следующей/кнопки go и соответствующим образом обновлять адаптер. Вы отдали «слишком большую ответственность» классу, который предназначен только для отображения данных в списке.

+0

i Внимание к вашим предложениям и благодарения. теперь я удивляюсь, что ho может передавать данные из фрагмента в адаптер?! .its только так, как я знаю об этом, у вас есть идея, как управлять следующей версией go go end recycler? – erfan

+0

Вы не можете принудительно просмотреть представление в конце RecyclerView. Вот почему я сказал, что это не должно быть частью адаптера, но Фрагмент. Не стесняйтесь создавать еще одну запись с вашим запросом и не забывайте принимать ее с помощью галочки –

+0

, так что вы знаете, как можно отправить значение собаки внутри фрагмента в адаптер. за вопрос задать новый вопрос и ответить? – erfan

0

Объявите это в адаптере

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(); 
       } 
      } 
     }); 

Я надеюсь, что это решит вашу проблему

+0

'private AdapterCallback callback;' уже существует. Он задан в конструкторе –

+1

Да Я предлагаю только передать заданные обратные вызовы только после создания адаптера. –

+0

Нет ничего плохого в объявлении как части конструктора. –

Смежные вопросы