android - 如何在回收站 View 中设置 On Item Click 监听器并将一个 Activity 中来自 JSON 的数据发送到另一个 Activity ?

标签 android json

我能够从 JSON 获取数据并将它们显示在回收站 View 中,我在单击列表时使用 Intent 将 JSON 对象从下面提到的此 Activity 发送到其他 Activity 时遇到问题。

这是我的主要 Activity 。

public class Category extends AppCompatActivity {
    JSONObject jsonobject;
    JSONArray jsonarray;
    ListView listview;
    ProgressDialog mProgressDialog;
    JSONParser jsonParser = new JSONParser();
    private String android_version_names[]={};
    private String id[]={};

    private String android_image_urls[]={};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.category);
        new DownloadJSON().execute();
        initViews();
    }

    protected void initViews(){
         RecyclerView recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view);
        recyclerView.setHasFixedSize(true);
        GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
        recyclerView.addItemDecoration(new MyItemDecorator(this));
        recyclerView.setLayoutManager(layoutManager);

        final ArrayList<CategoryVersions> androidVersions = prepareData();
        DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersions);
        recyclerView.setAdapter(adapter);
        adapter.SetOnItemClickListener(new DataAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                //Snackbar.make(mView, "Item id: "+position+" Product id"+prod.get(position).getId(), Snackbar.LENGTH_SHORT).show();
                //String number = getActivity().getIntent().getStringExtra("num");

                Intent intent = new Intent(Category.this, Products.class);

                CategoryVersions pp=androidVersions.get(position);
                //byte[] img= pp.getImage();
                intent.putExtra("num", pp.getId());
                Log.e("cat_id", "position:" + position + ",id:" + pp.getId());
                startActivity(intent);
            }
        });
        mProgressDialog.dismiss();
    }

    private ArrayList<CategoryVersions> prepareData(){

        ArrayList<CategoryVersions> android_version = new ArrayList<>();

        for(int i=0;i<android_version_names.length;i++){
            CategoryVersions androidVersion = new CategoryVersions();
            androidVersion.setAndroid_version_name(android_version_names[i]);
            androidVersion.setAndroid_image_url(android_image_urls[i]);
            android_version.add(androidVersion);
        }
        return android_version;
    }
    private class DownloadJSON extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Create a progressdialog
            mProgressDialog = new ProgressDialog(Category.this);
            // Set progressdialog title
            mProgressDialog.setTitle("Android JSON Parse Tutorial");
            // Set progressdialog message
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.setIndeterminate(false);
            // Show progressdialog
            mProgressDialog.show();
        }
        @Override
        protected Void doInBackground(Void... params) {
            // Create an array
            List<NameValuePair> prms = new ArrayList<NameValuePair>();
            prms.add(new BasicNameValuePair("user", "e465bef9-129b-11e9-9713-000c294888b7"));
            ArrayList<HashMap<String, String>> arraylist = new ArrayList<HashMap<String, String>>();
            // Retrieve JSON Objects from the given URL address
            jsonobject = jsonParser.makeHttpRequest("mu url","GET", prms);

            try {
                String type;
                // Locate the array name in JSON
                Log.d("JSON Data: ", jsonobject.toString());
                jsonarray = jsonobject.getJSONArray("data");
                android_version_names = new String[jsonarray.length()];
                android_image_urls = new String[jsonarray.length()];
                for (int i = 0; i < jsonarray.length(); i++) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject = jsonarray.getJSONObject(i);
                    // Retrive JSON Objects
                    android_version_names[i] = jsonobject.getString("name");
                    android_image_urls[i] = "my url"+jsonobject.getString("image");
                    map.put("name", jsonobject.getString("name"));
                    map.put("image", "my url"+jsonobject.getString("image"));
                    // Set the JSON Objects into the array
                    //arraylist.add(map);
                }

            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void args) {
            initViews();
        }
    }
}

这是我的适配器。

  public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
    private ArrayList<CategoryVersions> android_versions;
    private Context context;
    OnItemClickListener clickListener;

    public DataAdapter(Context context,ArrayList<CategoryVersions> android_versions) {
        this.context = context;
        this.android_versions = android_versions;

    }

    @Override
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.category_card, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int i) {

        viewHolder.tv_android.setText(android_versions.get(i).getAndroid_version_name());
        Picasso.with(context).load(android_versions.get(i).getAndroid_image_url()).resize(120, 60).into(viewHolder.img_android);


    }

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

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView tv_android;
        ImageView img_android;
        public ViewHolder(View v) {
            super(v);

            tv_android = (TextView)v.findViewById(R.id.tv_android);
            img_android = (ImageView)v.findViewById(R.id.img_android);
        }

        @Override
        public void onClick(View v) {

            clickListener.onItemClick(v, getAdapterPosition());
        }
    }

    public interface OnItemClickListener {
        public void onItemClick(View view, int position);
    }

    public void SetOnItemClickListener(final OnItemClickListener itemClickListener) {
        this.clickListener = itemClickListener;
    }

}

这是我应该在这个 Activity 中发送“id”的 Activity ,我应该将这个 id 存储为 cat_id。

public class Products extends AppCompatActivity {
    JSONObject jsonobject;
    JSONArray jsonarray;
    ListView listview;
    ProgressDialog mProgressDialog;
    JSONParser jsonParser = new JSONParser();
    private String android_version_names[]={};
    private String part_no[]={};
    String cat_id;
    private String android_image_urls[]={};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.product);
        cat_id=getIntent().getStringExtra("num");
        new DownloadJSON().execute();
        initViews();
    }

    protected void initViews(){
         RecyclerView recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view);
        recyclerView.setHasFixedSize(true);
        GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
        recyclerView.addItemDecoration(new MyItemDecorator(this));
        recyclerView.setLayoutManager(layoutManager);

        ArrayList<ProductVersions> androidVersions = prepareData();
        ProductAdapter adapter = new ProductAdapter(getApplicationContext(),androidVersions);
        recyclerView.setAdapter(adapter);
        mProgressDialog.dismiss();


    }



    private ArrayList<ProductVersions> prepareData(){

        ArrayList<ProductVersions> android_version = new ArrayList<>();

        for(int i=0;i<android_version_names.length;i++){
            ProductVersions androidVersion = new ProductVersions();
            androidVersion.setAndroid_version_name(android_version_names[i]);
            androidVersion.setPart_No(part_no[i]);
            androidVersion.setAndroid_image_url(android_image_urls[i]);
            android_version.add(androidVersion);
        }
        return android_version;
    }
    private class DownloadJSON extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Create a progressdialog
            mProgressDialog = new ProgressDialog(Products.this);
            // Set progressdialog title
            mProgressDialog.setTitle("Android JSON Parse Tutorial");
            // Set progressdialog message
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.setIndeterminate(false);
            // Show progressdialog
            mProgressDialog.show();
        }
        @Override
        protected Void doInBackground(Void... params) {
            // Create an array
            List<NameValuePair> prms = new ArrayList<NameValuePair>();
            prms.add(new BasicNameValuePair("user", "e465bef9-129b-11e9-9713-000c294888b7"));
            ArrayList<HashMap<String, String>> arraylist = new ArrayList<HashMap<String, String>>();
            // Retrieve JSON Objects from the given URL address

            jsonobject = jsonParser.makeHttpRequest("My URL" + cat_id ,"GET", prms);

            try {
                String type;
                // Locate the array name in JSON
                Log.d("JSON Data: ", jsonobject.toString());
                jsonarray = jsonobject.getJSONArray("data");
                android_version_names = new String[jsonarray.length()];
                part_no = new String[jsonarray.length()];
                android_image_urls = new String[jsonarray.length()];
                for (int i = 0; i < jsonarray.length(); i++) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject = jsonarray.getJSONObject(i);
                    // Retrive JSON Objects
                    android_version_names[i] = jsonobject.getString("product_name");
                    part_no[i] = jsonobject.getString("partno");
                    android_image_urls[i] = "My URL"+jsonobject.getString("product_image");
                    map.put("product_name", jsonobject.getString("product_name"));
                    map.put("partno", jsonobject.getString("partno"));
                    map.put("product_image", "My URL"+jsonobject.getString("product_image"));
                    // Set the JSON Objects into the array
                    //arraylist.add(map);
                }

            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void args) {
            initViews();
        }
    }
}

最佳答案

试试这个。 1.设置OnItemClickListner

改变

AdapterView.OnItemClickListener clickListener;

public interface OnItemClickListener {
    public void onItemClick(View view, int position);
}

public void SetOnItemClickListener(final OnItemClickListener itemClickListener) {
    this.clickListener = (AdapterView.OnItemClickListener) itemClickListener;
}

private OnItemClickListener mOnItemClickListener;

public interface OnItemClickListener {
    void setOnItemClickListener(View view, int position);
}

public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
    this.mOnItemClickListener = onItemClickListener;
}

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mOnItemClickListener.setOnItemClickListener(v, position);
        }
    });
}
  1. 发送数据

类别 Activity

Intent intent = new Intent(Category.this, Products.class);
CategoryVersions pp = androidVersions.get(position);
//byte[] img= pp.getImage();
intent.putExtra("num", pp.getId());
Log.e("cat_id", "position:" + position + ",id:" + pp.getId());
startActivity(intent);

另一个产品 Activity

String cat_id = getIntent().getStringExtra("num");
Log.e("cat_id", "cat_id:" + cat_id);

另一种方式

private ArrayList<CategoryVersions> android_versions;
private Context context;
OnItemClickListener clickListener;
public DataAdapter(Context context, ArrayList<CategoryVersions> android_versions) {
    this.context = context;
    this.android_versions = android_versions;

}

@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.category_card, viewGroup, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {

    viewHolder.tv_android.setText(android_versions.get(i).getAndroid_version_name());
    Picasso.with(context).load(android_versions.get(i).getAndroid_image_url()).resize(120, 60).into(viewHolder.img_android);
}

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

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView tv_android;
    ImageView img_android;

    public ViewHolder(View v) {
        super(v);

        tv_android = (TextView) v.findViewById(R.id.tv_android);
        img_android = (ImageView) v.findViewById(R.id.img_android);
        v.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        clickListener.onItemClick(v, getAdapterPosition());
    }
}

public interface OnItemClickListener {
    public void onItemClick(View view, int position);
}

public void SetOnItemClickListener(final OnItemClickListener itemClickListener) {
    this.clickListener = itemClickListener;
}

您只需删除 AdapterView.OnItemClickListener 并添加 v.setOnClickListener(this);

只需将您的代码更改为此即可正常工作。

编辑

public ViewHolder(View v) {
    super(v);

    tv_android = (TextView) v.findViewById(R.id.tv_android);
    img_android = (ImageView) v.findViewById(R.id.img_android);
    // add this to your code
    v.setOnClickListener(this);
}

关于android - 如何在回收站 View 中设置 On Item Click 监听器并将一个 Activity 中来自 JSON 的数据发送到另一个 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45709924/

相关文章:

java - 为什么在 RecyclerView.Adapter 的 onBindViewHolder 中添加 OnClickListener 被认为是不好的做法?

java - ZXingScannerView 在 Main 之外的另一个类中

Android Studio 重命名附加了库模块的模块包

java - 动态更改 Json 键名 - Jackson

android - Android 8 上的 kotlin 隐藏软键盘

Android - notifyDataSetChanged() 不适用于自定义适配器?

java - Jackson Object Mapper 读取值(以字节为单位)返回一个所有字段都初始化为 null 的对象

android - Google Analytics XML 配置文件与 JSON?

javascript - 我需要获取 Instagram 用户 ID# 以便在 Google 脚本中使用

javascript - 如何在 JSON 变量永久 JavaScript 数组中进行更改(例如分配新的键和值)?