[英]Trigger volley request on Recycler view item click
我是android的新手,並嘗試構建一個簡單的應用程序。 此應用程序包含3頁,類別,產品和詳細信息產品。 類別頁面使用voley從API請求數據並將其顯示在回收站視圖中。 我的問題是,如何在回收者視圖項目點擊時觸發另一個截擊請求(當有人點擊某個類別時)。 任何示例代碼或教程鏈接將不勝感激。 謝謝。
主要活動
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
List<movie> mDataset;
public static final String JSON_URL = "url"
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
mRecyclerView.setLayoutManager(mLayoutManager);
sendRequest();
}
private void sendRequest(){
StringRequest stringRequest = new StringRequest(JSON_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
JSONParse pj = new JSONParse(json);
pj.parseJSON();
mDataset = pj.getMovies();
mAdapter = new myadapter(mDataset);
mRecyclerView.setAdapter(mAdapter);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,error.getMessage(),Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
myadapter.java
public class myadapter extends RecyclerView.Adapter<myadapter.ViewHolder> {
Context context;
private List<movie> mDataset;
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView text;
public ImageView imageView;
public ViewHolder(View v) {
super(v);
text = (TextView) v.findViewById(R.id.text);
imageView = (ImageView) v.findViewById(R.id.icon);
}
}
public void add(int position, movie item) {
mDataset.add(position, item);
notifyItemInserted(position);
}
public void remove(movie item) {
int position = mDataset.indexOf(item);
mDataset.remove(position);
notifyItemRemoved(position);
}
public myadapter(List<movie> myDataset) {
mDataset = myDataset;
}
@Override
public myadapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyler_card, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.text.setText(mDataset.get(position).getName());
Glide.with(holder.imageView.getContext()).load(mDataset.get(position).getUrl()).into(holder.imageView);
}
@Override
public int getItemCount() {
return mDataset.size();
}
}
Volley自己啟動后台線程,因此所有網絡請求都是在UI線程上執行的,所以主要是你不再需要擴展AsyncTask。 您可以在同一活動上嘗試以下操作。
RecyclerTouchListener.java
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
private GestureDetector gestureDetector;
private ClickListener clickListener;
public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
Log.d("Slider", "constructer");
this.clickListener = clickListener;
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null) {
clickListener.onLongClick(child, recyclerView.getChildPosition(child));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
clickListener.onClick(child, rv.getChildPosition(child));
}
Log.d("Slider", "onInterceptTouchEvent" + gestureDetector.onTouchEvent(e));
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
Log.d("Slider", "onTouchEvent" + e);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public static interface ClickListener {
public void onClick(View view, int position);
public void onLongClick(View view, int position);
}
}
在您的活動頁面中使用以下:
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, recyclerView, new RecyclerTouchListener.ClickListener(){
@Override
public void onClick(View view, int position) {
//Get the data using position and call the function for volley request
}
@Override
public void onLongClick(View view, int position) {
}
}));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.