2016-05-08 18 views
2

私はrecyclerview内に一連のcardviewを持っています。各カードビューにはボタンが含まれています。ボタンをクリックすると、カードビューの子を再表示することになっています。しかし、それは次のカードビューで同じIDを持つ子供を隠すことを主張します。私はこれを引き起こしているのか、何を探しているのか全く分かりません。recyclerviewのボタンのOnClickListenerが間違った表示になっています

package in.kaluru.app.adapters; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.databinding.DataBindingUtil; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
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.JSONException; 
import org.json.JSONObject; 

import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import in.kaluru.app.BR; 
import in.kaluru.app.R; 
import in.kaluru.app.databinding.RowEntryBinding; 
import in.kaluru.app.models.EntryModel; 
import in.kaluru.app.views.MainActivityFragment; 

/** 
* Created by ritvik on 22/4/16. 
*/ 
public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.EntryViewHolder>{ 
    public static List<EntryModel> mEntries; 
    public View v; 
    public Context mContext; 
    public EntryAdapter(List<EntryModel> mEntries, Context mContext) { 
     this.mEntries = mEntries; 
     this.mContext = mContext; 
    } 

    public static class EntryViewHolder extends RecyclerView.ViewHolder { 
     private RowEntryBinding binding; 

     public EntryViewHolder(View rowView) { 
      super(rowView); 
      binding = DataBindingUtil.bind(rowView); 
     } 

     public RowEntryBinding getBinding() { 
      return binding; 
     } 
    } 

    @Override 
    public EntryViewHolder onCreateViewHolder(final ViewGroup parent, int type) { 
     v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.row_entry, parent, false); 

     v.findViewById(R.id.image_meta).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(parent.getContext(), 
         "This will open up a map showing nearby " + 
           "pictures with markers and have this one selected. Also still WIP.", 
         Toast.LENGTH_LONG).show(); 
      } 
     }); 

     v.findViewById(R.id.fixed).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       v.findViewById(R.id.note_section).setVisibility(View.VISIBLE); 
       view.setVisibility(View.GONE); 
      } 
     });; 

     v.findViewById(R.id.cancel_fixed).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       v.findViewById(R.id.note_section).setVisibility(View.GONE); 
       v.findViewById(R.id.fixed).setVisibility(View.VISIBLE); 
      } 
     }); 
     EntryViewHolder holder = new EntryViewHolder(v); 
     return holder; 
    } 


    @Override 
    public void onBindViewHolder(EntryViewHolder holder, int position) { 
     final EntryModel entry = mEntries.get(position); 

     v.findViewById(R.id.send_fixed).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       final String uuid = entry.uuid; 
       RequestQueue queue = Volley.newRequestQueue(mContext); 
       String url = "https://kaluru.in/fixed"; 

       StringRequest stringRequest = new StringRequest(Request.Method.POST, url, 
         new Response.Listener<String>() { 
          @Override 
          public void onResponse(String response) { 
           entry.setFixed(true); 
           notifyDataSetChanged(); 
          } 
         }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Log.d("Response", "That didn't work!"); 
         Log.e("VolleyError", error.toString()); 
        } 
       }){ 
        @Override 
        public Map<String, String> getParams() { 
         Map<String, String> mParams = new HashMap<String, String>(); 
         mParams.put("uuid", uuid); 
         mParams.put("note", ((EditText) v.findViewById(R.id.note)).getText().toString()); 
         return mParams; 
        } 
       }; 
       queue.add(stringRequest); 
      } 
     }); 

     holder.getBinding().setVariable(BR.entry, entry); 
     holder.getBinding().executePendingBindings(); 
    } 

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

そして、ここではスクリーンショットです:上の enter image description here

ビット私はここに私のアダプタコードは(すべてがここで起こる)ですが、また、私は非常によく、このいずれかを説明していないかなり確信していますボタンが入っていたカードである "Locality unavailable"というカードの下に、 "Note"、 "Send"、そして "Cancel"と書かれている部分が実際にはさまれているはずです。

答えて

1

問題はここにある:

public void onBindViewHolder(EntryViewHolder holder, int position) { 
     final EntryModel entry = mEntries.get(position); 
     // the following is givving you a problem: 
     v.findViewById(R.id.send_fixed).setOnClickListener(new View.OnClickListener() { 

あなたは正しい順序でプログラムを使用している場合は、あなたのクラスvのプライベートメンバを使用している、あなたの最後のビューの内容を保持します。

onBindViewHolderはあなたので、あなたのホルダーオブジェクトの代わりに、V上での操作をする必要がありRecyclerViewの現在の項目を保持しているholderオブジェクトを与えるおそらく、このような何か:。

RowEntryBinding b = holder.getBinding(); 
//now perform operations on b object instead of v 
+2

を 'v'があるべきローカル変数、 'onBindViewHolder()'の 'v = holder.itemView' – tynn

+0

が表示されます。私はとても長い時間がかかりましたが、申し訳ありません。私はそれに今日行くと、それが動作する場合、あなたは答えを受け入れている。御時間ありがとうございます。 –

関連する問題