[英]Trigger volley request on Recycler view item click
I'm kinda new to android and try to build a simple application. 我是android的新手,并尝试构建一个简单的应用程序。 This application consist of 3 pages, categories , products and detail product.
此应用程序包含3页,类别,产品和详细信息产品。 The category page is requesting data from an API using voley and display it in a recycler view.
类别页面使用voley从API请求数据并将其显示在回收站视图中。 My question are, how i can trigger another volley request on recycler view item click ( when someone click a category ).
我的问题是,如何在回收者视图项目点击时触发另一个截击请求(当有人点击某个类别时)。 Any sample code or tutorial links will be appreciated.
任何示例代码或教程链接将不胜感激。 Thank you.
谢谢。
MainActivity 主要活动
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 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 is initiating background thread(s) on its own so all the network requests are executed off the UI thread so primarily you don't need to extend AsyncTask anymore. Volley自己启动后台线程,因此所有网络请求都是在UI线程上执行的,所以主要是你不再需要扩展AsyncTask。 You can try the following on the same activity.
您可以在同一活动上尝试以下操作。
RecyclerTouchListener.java 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);
}
}
In your Activity page use below: 在您的活动页面中使用以下:
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.