2016-11-01 4 views
0

Ich versuche, meine Daten vom Server abzurufen und dann mit Hilfe von RecyclerView anzuzeigen. Meine RecyclerView enthält 4 Schaltflächen und jede Schaltfläche sendet die Daten an verschiedene Tabellen. Das ist, was ich versucht:Nur das letzte Element der Recycler-Ansicht wird nach dem onclicklistener angezeigt

public class QuoteAdapter extends RecyclerView.Adapter<QuoteAdapter.ViewHolder> { 
    List<QuoteList> qItems; 
    String sQuote,sName,sEmail; 
    public QuoteAdapter(List<QuoteList> qItems) { 
     this.qItems = qItems; 
    } 

    @Override 
    public QuoteAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fetch_list, parent, false); 
     ViewHolder viewHolder = new ViewHolder(v); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(final QuoteAdapter.ViewHolder holder, int position) { 
     final QuoteList codeListBeans = qItems.get(position); 
     final Background background = new Background(); 
     holder.tv_quote.setText(codeListBeans.getQuote()); 
     holder.tv_name.setText(codeListBeans.getName()); 
     holder.tv_email.setText(codeListBeans.getEmail()); 
     sQuote=holder.tv_quote.getText().toString(); 
     sName=holder.tv_name.getText().toString(); 
     sEmail=holder.tv_email.getText().toString(); 

     holder.btn_other.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       url = "http://velapanti.esy.es/quotation/other/add.php"; 
       background.execute(sQuote, sEmail, sName); 
      } 
     }); 
     holder.btn_love.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       url = "http://velapanti.esy.es/quotation/love/add.php"; 
       background.execute(sQuote, sEmail, sName); 
      } 
     }); 
     holder.btn_mot.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       url = "http://velapanti.esy.es/quotation/motivation/add.php"; 
       background.execute(sQuote, sEmail, sName); 
      } 
     }); 
     holder.btn_frnd.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       url = "http://velapanti.esy.es/quotation/friends/add.php"; 
       background.execute(sQuote, sEmail, sName); 
      } 
     }); 

    } 

    class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView tv_name, tv_quote, tv_email; 
     public Button btn_other, btn_mot, btn_love, btn_frnd; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      tv_quote = (TextView) itemView.findViewById(R.id.tv_quote); 
      tv_name = (TextView) itemView.findViewById(R.id.tv_name); 
      tv_email = (TextView) itemView.findViewById(R.id.tv_email); 
      btn_frnd = (Button) itemView.findViewById(R.id.btn_frnd); 
      btn_love = (Button) itemView.findViewById(R.id.btn_love); 
      btn_mot = (Button) itemView.findViewById(R.id.btn_mot); 
      btn_other = (Button) itemView.findViewById(R.id.btn_other); 
     } 
    } 

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

    class Background extends AsyncTask<String, String, String> { 
     @Override 
     protected void onPreExecute() { 

      if (isConnection()) { 
       super.onPreExecute(); 
       progressDialog.show(); 
      } else { 
       showConnectionErrorDialog(); 
       startActivity(getIntent()); 
      } 
     } 

     @Override 
     protected String doInBackground(String... strings) { 
      sQuote = strings[0]; 
      sEmail = strings[1]; 
      sName = strings[2]; 

      try { 
       URL openUrl = new URL(url); 
       HttpURLConnection httpURLConnection = (HttpURLConnection) openUrl.openConnection(); 
       httpURLConnection.setRequestMethod("POST"); 
       httpURLConnection.setDoOutput(true); 

       OutputStream OS = httpURLConnection.getOutputStream(); 
       BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS, "UTF-8")); 
       String data = URLEncoder.encode("quote", "UTF-8") + "=" + URLEncoder.encode(sQuote, "UTF-8") 
         + "&" + 

         URLEncoder.encode("email", "UTF-8") + "=" + URLEncoder.encode(sEmail, "UTF-8") 
         + "&" + 

         URLEncoder.encode("name", "UTF-8") + "=" + URLEncoder.encode(sName, "UTF-8"); 
       bufferedWriter.write(data); 
       bufferedWriter.flush(); 
       bufferedWriter.close(); 
       OS.close(); 
       InputStream IS = httpURLConnection.getInputStream(); 
       IS.close(); 
       httpURLConnection.disconnect(); 
       return "Quotation Added"; 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
     @Override 
     protected void onPostExecute(String result) { 
      progressDialog.dismiss(); 
      Snackbar.make(layout, result, Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    } 
} 

Das Problem, das ich bin vor, wenn ich die Daten aus der letzten Zeile bewegt, unabhängig von der Zeile in der Tabelle auf jeder Schaltfläche klicken, von dem ich die Schaltfläche dh klicken, wenn ich auf die In einer beliebigen Zeile werden die Daten aus der letzten Zeile gesendet, aber nicht aus der Zeile, zu der die Schaltfläche gehört.

Antwort

0

Das Problem hier ist einfach. In Ihrer onBindViewHolder() Methode erhalten Sie data (sQuote, sEmail, sName) und speichern sie unabhängig voneinander. Jetzt, wenn die RecyclerView beendet Hinzufügen und Einstellen von Daten zu allen View s Ihre data Container sind auch aktualisiert, so dass Ihre data Werte von letzten onBindView() Aufruf enthält.

Das heißt, wenn Sie nach unten scrollen und geklickt haben, senden Sie data aus dem View. Ähnlich, wenn Sie nach oben scrollen würden, würden Sie Daten von der obersten sichtbarsten View senden.

Sie müssen einen Weg finden, so dass Ihre data aktualisiert bleibt.

Wie erhalten Daten von sQuote, etc. erhalten Daten von qItems.

Auch als allgemeine Regel erstellen Sie keine neuen Objekte in onBindViewHolder() vor allem Listener stattdessen erstellen sie entweder in onCreateViewHolder() oder in Ihrem ViewHolder. Denn jedes Mal, wenn Sie zurück in eine View scrollen, wird eine weitere Object erstellt.

Für Zuhörer, die Position der angeklickt View benötigen setzen Sie sie in ViewHolder (wie in Ihrem Fall). So können Sie leicht die Position des angeklickten View von getAdapterPosition() bekommen.

Verwandte Themen