2016-11-01 16 views
0

サーバーからデータを取得してからRecyclerViewのヘルプで表示しようとしています。私のRecyclerViewには4つのボタンがあり、各ボタンは異なるテーブルにデータを送信します。リサイクルビューの最後の要素のみがonclicklistenerの後に表示されます

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

私はいずれかのボタンをクリックされたときに直面しています問題は、私はボタンをクリックし、そこから関係なく、行のテーブルに最後の行に移動するからのデータはすなわち、私がクリックした場合:これは私が試したものです最後の行のデータは送信されますが、ボタンが属する行からは送信されません。

答えて

0

ここでの問題は簡単です。 onBindViewHolder()メソッドでは、datasQuote,sEmail,sName)を取得し、それらを独立して保存しています。ここでRecyclerViewViewのすべてのデータの追加と設定を完了すると、dataコンテナも更新され、dataには最後のonBindView()の値が含まれます。

つまり、スクロールしてクリックするとをViewから送信します。同様に上にスクロールする場合は、最も目立つViewからデータを送信します。

あなたのdataが更新されているようにする必要があります。

sQuoteなどからデータを取得する代わりに、qItemsからデータを取得します。

また、一般的な規則として、またはViewHolderのいずれかに、リスナーを作成する代わりに、onBindViewHolder()に新しいオブジェクトを作成しないでください。 Viewにスクロールするたびに別のObjectが作成されるためです。

クリックした位置が必要なリスナーの場合ViewViewHolder(あなたの場合のように)に入れます。クリックした位置を簡単に得ることができますViewによってgetAdapterPosition()

関連する問題