【问题标题】:Trigger volley request on Recycler view item click在 Recycler 查看项目单击时触发 volley 请求
【发布时间】:2017-03-19 06:54:59
【问题描述】:

我对 android 有点陌生,并尝试构建一个简单的应用程序。此应用程序由 3 个页面、类别、产品和详细产品组成。类别页面使用 voley 从 API 请求数据并将其显示在回收器视图中。我的问题是,我如何在回收站查看项目点击时触发另一个凌空请求(当有人点击一个类别时)。任何示例代码或教程链接将不胜感激。谢谢你。

【问题讨论】:

  • 我认为当“类别回收查看项目点击”时,只需转到我设计为“活动”的产品页面,并在该页面中“发送另一个凌空请求”。大多数时候,我在那个 Activity 的“onResume”函数中发送一个请求
  • 你的意思是,以category_id为参数开始一个新的intent,然后对该activity触发一个volley请求,对吗?
  • 是的,你可以吗?

标签: android android-recyclerview android-volley


【解决方案1】:

主活动

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

}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      相关资源
      最近更新 更多