我能够从 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);
}
});
}
- 发送数据
类别 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/