英文:
Using RecyclerView in android studio but nothing is getting printed
问题
以下是已翻译的内容:
这是一个页面,我想在这里打印出从 Parse 仪表板中提取的所有用户名和价格:
public class HomePage extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_page);
final RecyclerView list = (RecyclerView)findViewById(R.id.list);
list.setLayoutManager(new LinearLayoutManager(this));
final ArrayList<String> username = new ArrayList<String>();
final ArrayList<String> netPrice = new ArrayList<String>();
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Image");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e == null) {
if (objects.size() > 0) {
for(ParseObject object : objects) {
String user = object.getString("username");
String price = object.getString("price");
username.add(user);
netPrice.add(price);
}
}
} else {
e.printStackTrace();
}
}
});
list.setAdapter(new ListAdapter(username, netPrice));
}
}
这是我的适配器,名为 ListAdapter:
public class ListAdapter extends RecyclerView.Adapter {
private ArrayList<String> data1;
private ArrayList<String> data2;
public ListAdapter(ArrayList<String> data1, ArrayList<String> data2) {
this.data1 = data1;
this.data2 = data2;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.list_layout, parent, false);
return new ListViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
String title1 = data1.get(position);
final TextView viewById1 = holder.itemView.findViewById(R.id.text1);
viewById1.setText(title1);
String title2 = data2.get(position);
final TextView viewById2 = holder.itemView.findViewById(R.id.text2);
viewById2.setText(title2);
}
@Override
public int getItemCount() {
return data1.size();
}
public class ListViewHolder extends RecyclerView.ViewHolder {
public ListViewHolder(View itemView) {
super(itemView);
}
}
}
虽然没有报错,但什么都没有被打印出来。我在适配器中传递了 ArrayList,这样做是允许的吗?请帮忙,我已经被困在这里尝试了 8 小时。
英文:
This is the page where i want to print all the usernames and price extracted from Parse dashboard
public class HomePage extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_page);
final RecyclerView list=(RecyclerView)findViewById(R.id.list);
list.setLayoutManager(new LinearLayoutManager(this));
final ArrayList<String> username = new ArrayList<String>();
final ArrayList<String> netPrice = new ArrayList<String>();
ParseQuery<ParseObject> query=new ParseQuery<ParseObject>("Image");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e==null){
if (objects.size()>0) {
for(ParseObject object : objects){
String user=object.getString("username");
String price=object.getString("price");
username.add(user);
netPrice.add(price);
}
}
}
else{
e.printStackTrace();
}
}
});
list.setAdapter(new ListAdapter(username,netPrice));
}
}
This is my Adapter named ListAdapter
public class ListAdapter extends RecyclerView.Adapter {
private ArrayList<String>data1;
private ArrayList<String>data2;
public ListAdapter(ArrayList<String> data1, ArrayList<String> data2){
this.data1=data1;
this.data2=data2;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater=LayoutInflater.from(parent.getContext());
View view= inflater.inflate(R.layout.list_layout,parent,false);
return new ListViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
String title1=data1.get(position);
final TextView viewById1 = holder.itemView.findViewById(R.id.text1);
viewById1.setText(title1);
String title2=data2.get(position);
final TextView viewById2 = holder.itemView.findViewById(R.id.text2);
viewById2.setText(title2);
}
@Override
public int getItemCount() {
return data1.size();
}
public class ListViewHolder extends RecyclerView.ViewHolder {
public ListViewHolder(View itemView) {
super(itemView);
}
}
}
This shows no error but nothing is getting printed.
I have passed ArrayList in my Adapter, am I allowed to that?
please help, I am struck badly trying to do this since 8 hrs.
答案1
得分: 1
你的项目数量应该与你想展示的项目大小相同
@Override
public int getItemCount() {
return 1; // 在这里返回项目的数量
}
英文:
your item count should have the size of the items you want to show
@Override
public int getItemCount() {
return 1; // return here the number of items
}
答案2
得分: 0
问题出在背景查询代码中。
它调用了 query.findInBackground
,然后直接调用了 list.setAdapter(...)
,而此时 [username, netPrice]
仍然是空列表。所以你需要等待,直到 done
方法完成,然后在 RecyclerView 中设置数据。
你可以这样做:
1 - 创建一个名为 setRecyclerViewData
的方法,用于设置 RecyclerView 的数据。
2 - 在 done
方法中的 for each 循环完成后调用 setRecyclerViewData
,这样你就可以确保 [username, netPrice]
有一些数据。
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e == null) {
if (objects.size() > 0) {
for (ParseObject object : objects) {
String user = object.getString("username");
String price = object.getString("price");
username.add(user);
netPrice.add(price);
}
setRecyclerViewData(username, netPrice);
} else {
Log.d("Tag", "Objects size = 0");
}
} else {
e.printStackTrace();
}
}
});
private void setRecyclerViewData(ArrayList<String> username, ArrayList<String> netPrice) {
list.setAdapter(new ListAdapter(username, netPrice));
}
此外,通常在 RecyclerView 适配器中不会这样做,这样虽然不会显示错误,但不符合约定。
英文:
problem is with the background word.
It is calling query.findInBackground
and directly after that list.setAdapter(...)
which at this time, [username, netPrice] are still empty lists.
So you need to wait, until you done
method is done and then set data in recycleView.
You can do that by:
1 - Create a method setRecyclerViewData
which will set the recyclerview data.
2 - call setRecyclerViewData
inside done
after it finishes the for each loop
that way you will be sure that [username, netPrice] have some data.
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e==null){
if (objects.size()>0) {
for(ParseObject object : objects){
String user=object.getString("username");
String price=object.getString("price");
username.add(user);
netPrice.add(price);
}
setRecyclerView(username, netPrice);
}
else{
log.d("Tag", "Objects size = 0");
}
}
else{
e.printStackTrace();
}
}
});
private void setRecyclerView(ArrayList<String> username, ArrayList<String> netPrice){
list.setAdapter(newListAdapter(username,netPrice));
}
plus thing don't usually go this way in recylerview adapter, it is not showing error OK, but this is not the convention.
答案3
得分: 0
空白屏幕出现的原因是因为您的适配器中没有数据,在获取query.findInBackground
中的数据后,您没有通知适配器有新数据。
所以,您需要做的是:
首先,将适配器实例存储到一个变量中:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
final ArrayList<String> username = new ArrayList<String>();
final ArrayList<String> netPrice = new ArrayList<String>();
ListAdapter listAdapter = new ListAdapter(username,netPrice); // 添加这行
...
list.setAdapter(listAdapter);
}
然后,在您的query.findInBackground
中通知适配器有新数据:
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e==null){
if (objects.size()>0) {
for(ParseObject object : objects){
String user=object.getString("username");
String price=object.getString("price");
username.add(user);
netPrice.add(price);
}
listAdapter.notifyDataSetChanged(); // 添加这行
}
}
else{
e.printStackTrace();
}
}
});
英文:
The reason you are seeing an empty screen is because your adapter contains no data, after getting the data in query.findInBackground
, you don't notify the adapter that there is a new data.
So, what you need to do is
First, store your adapter instance into a variable
@Override
protected void onCreate(Bundle savedInstanceState) {
...
final ArrayList<String> username = new ArrayList<String>();
final ArrayList<String> netPrice = new ArrayList<String>();
ListAdapter listAdapter = new ListAdapter(username,netPrice); // Add this line
...
list.setAdapter(listAdapter);
}
Then, in your query.findInBackground
notify the adapter that there is a new data
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e==null){
if (objects.size()>0) {
for(ParseObject object : objects){
String user=object.getString("username");
String price=object.getString("price");
username.add(user);
netPrice.add(price);
}
listAdapter.notifyDataSetChanged(); // Add this line
}
}
else{
e.printStackTrace();
}
}
});
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论