我正在尝试创建商品列表,然后按照与下图类似的方式创建商品名称和热量值。
但是,我试图从Parse获取所有数据时执行此操作。我大部分时间都没做好,但是在我循环浏览它们时,我一直被困了几个小时,试图以编程方式添加这两个文本视图,然后一个接一个地添加图像(然后是文本,然后是视图)。
我一直怀疑是否要对代码进行重大更改,因为我不太精通android,但是从到目前为止的观察来看,我的案例似乎是独一无二的,因为它涉及Parse以及结合使用textview和imageview。
以下是我到目前为止在此活动中得到的信息:
XML
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AdminProductsListActivity">
<ScrollView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/linLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"></LinearLayout>
</ScrollView>
</android.support.constraint.ConstraintLayout>
课程
package com.parse.starter;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.parse.FindCallback;
import com.parse.GetDataCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseUser;
import java.util.List;
public class AdminProductsListActivity extends AppCompatActivity {
LinearLayout linLayout;
Intent intent;
String name;
TextView itemName;
TextView itemCalories;
ImageView imageView;
public void showMain() {
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}
public void addNewProduct() {
Intent intent = new Intent(getApplicationContext(), AddNewProductActivity.class);
intent.putExtra("shop", name);
startActivity(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.new_admin_settings_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.newItem){
ParseUser.logOut();
addNewProduct();
} else if (item.getItemId() == R.id.logout){
ParseUser.logOut();
showMain();
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin_products_list);
intent = getIntent();
name = intent.getStringExtra("username");
linLayout = (LinearLayout) findViewById(R.id.linLayout);
setTitle(name);
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Product");
query.whereEqualTo("username", name);
query.orderByDescending("objectID");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> list, ParseException e) {
if (e == null && list.size() > 0){
for (ParseObject object : list){
ParseFile file = (ParseFile) object.get("image");
//if (itemName != null && itemCalories != null){
itemName = new TextView(getApplicationContext());
itemName.setText(object.getString("name"));
itemName.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
itemCalories = new TextView(getApplicationContext());
itemCalories.setText(object.getString("calories") + " kcal");
itemCalories.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
linLayout.addView(itemCalories);
linLayout.addView(itemName);
file.getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] bytes, ParseException e) {
if (e == null && bytes != null){
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
imageView = new ImageView(getApplicationContext());
imageView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
));
imageView.setImageBitmap(bitmap);
linLayout.addView(imageView);
}
}
});
}
}
}
});
}
}
现在发生的是所有文本都移到顶部,图像移到了底部。我也尝试过这样做:
file.getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] bytes, ParseException e) {
if (e == null && bytes != null){
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
imageView = new ImageView(getApplicationContext());
imageView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
));
imageView.setImageBitmap(bitmap);
linLayout.addView(imageView);
linLayout.addView(itemCalories);
linLayout.addView(itemName);
但随后出现此错误:
The specified child already has a parent. You must call removeView() on the child's parent first.
,在这种情况下,我发现此错误的答案似乎都没有帮助。
长话短说,我什至没有在寻找超级复杂的东西或看起来不错的东西,我只是一个初学者。我只想在使用解析时先加载文本视图,然后再加载图像视图,就像在图像中一样。
有什么想法吗?