Java 如何在RecyclerView上设置onClickListener?
我制作了一个卡片视图,从internet加载数据并显示它。我有一个JSONParser类来解析json数据。然后,我将数据存储在ListItem类型的arraylist中。但是,我不能使用onCliclListener 以下是JSONParser.java文件:Java 如何在RecyclerView上设置onClickListener?,java,android,android-recyclerview,android-cardview,cardview,Java,Android,Android Recyclerview,Android Cardview,Cardview,我制作了一个卡片视图,从internet加载数据并显示它。我有一个JSONParser类来解析json数据。然后,我将数据存储在ListItem类型的arraylist中。但是,我不能使用onCliclListener 以下是JSONParser.java文件: public class JSONParser extends AsyncTask<Void,Void,Boolean>{ Context c; String jsonData; RecyclerV
public class JSONParser extends AsyncTask<Void,Void,Boolean>{
Context c;
String jsonData;
RecyclerView rv;
private final Context context=null;
ProgressDialog pd;
ArrayList<String> names=new ArrayList<>();
ArrayList<String> ages=new ArrayList<>();
ArrayList<String> addresses=new ArrayList<>();
ArrayList<String> bgs=new ArrayList<>();
List<ListItem> data = new ArrayList<>();
public JSONParser(Context c, String jsonData, RecyclerView rv) {
this.c = c;
this.jsonData = jsonData;
this.rv = rv;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pd=new ProgressDialog(c);
pd.setTitle("Parse JSON");
pd.setMessage("Parsing...Please wait");
pd.show();
}
@Override
protected Boolean doInBackground(Void... voids) {
return parse();
}
@Override
protected void onPostExecute(Boolean isParsed) {
super.onPostExecute(isParsed);
pd.dismiss();
if(isParsed)
{
//BIND
MyAdapter adapter=new MyAdapter(c,names,ages,addresses,bgs);
rv.setAdapter(adapter);
}else
{
Toast.makeText(c, "Unable To Parse,Check Your Log output", Toast.LENGTH_SHORT).show();
}
}
private Boolean parse()
{
try
{
JSONArray ja=new JSONArray(jsonData);
JSONObject jo;
names.clear();
ages.clear();
addresses.clear();
bgs.clear();
for (int i=0;i<ja.length();i++)
{
jo=ja.getJSONObject(i);
List<ListItem> ldata = new ArrayList<>();
ListItem item = new ListItem();
String name=jo.getString("name");
String age=jo.getString("mob");
String address=jo.getString("add");
String bg=jo.getString("bg");
names.add(name);
ages.add(age);
addresses.add(address);
bgs.add(bg);
item.setName(name);
item.setAge(age);
item.setAddress(address);
item.setBg(bg);
ldata.add(item);
setData(ldata);
}
return true;
} catch (JSONException e) {
e.printStackTrace();
return false;
}
}
public void setData(List<ListItem> data) {
this.data = data;
}
public List<ListItem> getData() {
return data;
}
}
这是我的适配器java代码:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
Context c;
ArrayList<String> names;
ArrayList<String> ages;
ArrayList<String> addresses;
ArrayList<String> bgs;
private ItemClickCallback itemClickCallback;
public MyAdapter(Context c, ArrayList<String> names, ArrayList<String> ages, ArrayList<String> addresses, ArrayList<String> bgs) {
this.c = c;
this.names = names;
this.ages = ages;
this.addresses = addresses;
this.bgs = bgs;
}
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(c).inflate(R.layout.model, parent, false);
return new MyViewHolder(v);
}
public interface ItemClickCallback {
void onItemClick(int p);
void onSecondaryIconClick(int p);
}
public void setItemClickCallback(final ItemClickCallback itemClickCallback) {
this.itemClickCallback = itemClickCallback;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//BIND
holder.nameTxt.setText(names.get(position));
holder.ageTxt.setText(ages.get(position));
holder.addTxt.setText(addresses.get(position));
if (bgs.get(position).toString().equals("AP")) {
holder.bg.setImageResource(R.drawable.apr);
}
if (bgs.get(position).toString().equals("AN")) {
holder.bg.setImageResource(R.drawable.anr);
}
if (bgs.get(position).toString().equals("BP")) {
holder.bg.setImageResource(R.drawable.bpr);
}
if (bgs.get(position).toString().equals("BN")) {
holder.bg.setImageResource(R.drawable.bnr);
}
if (bgs.get(position).toString().equals("ABP")) {
holder.bg.setImageResource(R.drawable.abpr);
}
if (bgs.get(position).toString().equals("ABN")) {
holder.bg.setImageResource(R.drawable.abnr);
}
if (bgs.get(position).toString().equals("OP")) {
holder.bg.setImageResource(R.drawable.opr);
}
if (bgs.get(position).toString().equals("ON")) {
holder.bg.setImageResource(R.drawable.onr);
}
}
@Override
public int getItemCount() {
return names.size();
}
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView nameTxt, ageTxt, addTxt;
ImageView bg;
public MyViewHolder(View itemView) {
super(itemView);
nameTxt = (TextView) itemView.findViewById(R.id.textView101);
ageTxt = (TextView) itemView.findViewById(R.id.textView887);
addTxt = (TextView) itemView.findViewById(R.id.textView77);
bg = (ImageView) itemView.findViewById(R.id.imageView83);
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.cont_item_root) {
itemClickCallback.onItemClick(getAdapterPosition());
} else {
itemClickCallback.onSecondaryIconClick(getAdapterPosition());
}
}
}
}
您应该初始化JsonParser
jsonParser = new JsonParser(c, jsonData, rv);
listData = (ArrayList) jsonParser.getData();
但是,您不能立即调用jsonParser.getData
,您需要等待异步任务完成
public class JSONParser {
ProgressDialog pd;
ArrayList<String> names=new ArrayList<>();
ArrayList<String> ages=new ArrayList<>();
ArrayList<String> addresses=new ArrayList<>();
ArrayList<String> bgs=new ArrayList<>();
ArrayList<ListItem> data = new ArrayList<>();
public JSONParser(final Context c, final String jsonData, final RecyclerView rv, final OnFinishListener onFinishListener) {
new AsyncTask<Void, Void, Boolean>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
pd=new ProgressDialog(c);
pd.setTitle("Parse JSON");
pd.setMessage("Parsing...Please wait");
pd.show();
}
@Override
protected Boolean doInBackground(Void... params) {
try {
JSONArray ja=new JSONArray(jsonData);
JSONObject jo;
names.clear();
ages.clear();
addresses.clear();
bgs.clear();
for (int i=0;i<ja.length();i++) {
jo=ja.getJSONObject(i);
ArrayList<ListItem> ldata = new ArrayList<>();
ListItem item = new ListItem();
String name=jo.getString("name");
String age=jo.getString("mob");
String address=jo.getString("add");
String bg=jo.getString("bg");
names.add(name);
ages.add(age);
addresses.add(address);
bgs.add(bg);
item.setName(name);
item.setAge(age);
item.setAddress(address);
item.setBg(bg);
ldata.add(item);
setData(ldata);
}
return true;
} catch (JSONException e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean isParsed) {
super.onPostExecute(isParsed);
pd.dismiss();
if(isParsed) {
//BIND
MyAdapter adapter=new MyAdapter(c,names,ages,addresses,bgs);
rv.setAdapter(adapter);
onFinishListener.finished(data);
}else {
Toast.makeText(c, "Unable To Parse,Check Your Log output", Toast.LENGTH_SHORT).show();
}
}
}.execute();
}
public void setData(ArrayList<ListItem> data) {
this.data = data;
}
public ArrayList<ListItem> getData() {
return data;
}
public interface OnFinishListener{
void finished(ArrayList<ListItem> data);
}
}
您应该初始化JsonParser
jsonParser = new JsonParser(c, jsonData, rv);
listData = (ArrayList) jsonParser.getData();
但是,您不能立即调用jsonParser.getData
,您需要等待异步任务完成
public class JSONParser {
ProgressDialog pd;
ArrayList<String> names=new ArrayList<>();
ArrayList<String> ages=new ArrayList<>();
ArrayList<String> addresses=new ArrayList<>();
ArrayList<String> bgs=new ArrayList<>();
ArrayList<ListItem> data = new ArrayList<>();
public JSONParser(final Context c, final String jsonData, final RecyclerView rv, final OnFinishListener onFinishListener) {
new AsyncTask<Void, Void, Boolean>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
pd=new ProgressDialog(c);
pd.setTitle("Parse JSON");
pd.setMessage("Parsing...Please wait");
pd.show();
}
@Override
protected Boolean doInBackground(Void... params) {
try {
JSONArray ja=new JSONArray(jsonData);
JSONObject jo;
names.clear();
ages.clear();
addresses.clear();
bgs.clear();
for (int i=0;i<ja.length();i++) {
jo=ja.getJSONObject(i);
ArrayList<ListItem> ldata = new ArrayList<>();
ListItem item = new ListItem();
String name=jo.getString("name");
String age=jo.getString("mob");
String address=jo.getString("add");
String bg=jo.getString("bg");
names.add(name);
ages.add(age);
addresses.add(address);
bgs.add(bg);
item.setName(name);
item.setAge(age);
item.setAddress(address);
item.setBg(bg);
ldata.add(item);
setData(ldata);
}
return true;
} catch (JSONException e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean isParsed) {
super.onPostExecute(isParsed);
pd.dismiss();
if(isParsed) {
//BIND
MyAdapter adapter=new MyAdapter(c,names,ages,addresses,bgs);
rv.setAdapter(adapter);
onFinishListener.finished(data);
}else {
Toast.makeText(c, "Unable To Parse,Check Your Log output", Toast.LENGTH_SHORT).show();
}
}
}.execute();
}
public void setData(ArrayList<ListItem> data) {
this.data = data;
}
public ArrayList<ListItem> getData() {
return data;
}
public interface OnFinishListener{
void finished(ArrayList<ListItem> data);
}
}
请在何处共享适配器java codeNullpointer异常?发布您的logcatdone@TiagoOliveiraim检查是否有问题我刚刚在我的应用程序上实现了同样的事情10分钟前可能重复的请共享您的适配器java codeNullpointer异常在哪里?发布您的logcatdone@TiagoOliveiraim检查是否有问题我在10分钟前在我的应用程序上实现了相同的事情可能在单击卡项后仍然没有发生任何重复!您的代码有不止一个问题,请给我一些时间来检查它是否说onfinishlistener在JSONParser中不是公共的..我应该将其公开吗?我这样做了,它再次显示空指针异常!哪里在jsonparser上?或者在界面上?单击卡片项目后仍然没有发生任何事情!您的代码有不止一个问题,请给我一些时间来检查它是否说onfinishlistener在JSONParser中不是公共的..我应该将其公开吗?我这样做了,它再次显示空指针异常!哪里在jsonparser上?还是在界面上?
jsonParser = new JsonParser(c, jsonData, rv,new JSONParser.OnFinishListener() {
@Override
public void finished(ArrayList<ListItem> data) {
listData = data;
}
});
//nameTxt.setOnClickListener(this);
//ageTxt.setOnClickListener(this);
//addTxt.setOnClickListener(this);
//i don't see the cont_item_root anywhere
//bg = (ImageView) itemView.findViewById(R.id.imageView83);
bg.setOnClickListener(this);
...
@Override
public void onClick(View view) {
if (view.getId() == R.id.imageView83) { //maybe this?
itemClickCallback.onItemClick(getAdapterPosition());
}
}
}