我尝试将在 ListView
中选择的数据项传递到下一个 Activity
。但我所能做的就是第二个 Activity 为空或 nullpoineException 错误。我用 RecycleView
做到了,但用 ListView
则出现了一些问题。
主要 Activity :
public class ListViewPlaces extends AppCompatActivity {
FirebaseFirestore mFirestore = FirebaseFirestore.getInstance();
CollectionReference placeRef = mFirestore.collection("Places");
Query query;
ListView mListView;
String name;
Places places;
ArrayList<Places> randomPlaceList;
PlaceAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_places);
mListView = findViewById(R.id.place_list);
randomPlaceList = new ArrayList<>();
Boolean l_check1 = getIntent().getExtras().getBoolean("1");
Boolean l_check2 = getIntent().getExtras().getBoolean("2");
if (l_check2){
query = placeRef.whereEqualTo("colour", "red");
} else if (l_check1){
query = placeRef.whereEqualTo("size", "1");
} else {
query = placeRef.whereEqualTo("size", "2");
}
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Places> placesList = new ArrayList<>();
for (DocumentSnapshot document : task.getResult()) {
Places place = document.toObject(Places.class);
placesList.add(place);
}
int placeCount = placesList.size();
Random randomGenerator = new Random();
ArrayList<Places> randomPlaceList = new ArrayList<>();
for (int i = 1; i <= 3; i++) {
randomPlaceList.add(placesList.get(randomGenerator.nextInt(placeCount)));
}
ListView mListView = (ListView) findViewById(R.id.place_list);
mAdapter = new PlaceAdapter(randomPlaceList, getBaseContext());
mListView.setAdapter(mAdapter);
}
}
});
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Places places = mAdapter.getItem(position);
Intent intent = new Intent(getApplicationContext(), Card_activity.class);
intent.putExtra("name", places.getName());
startActivity(intent);
}
});
}
}
我的模型类:
public class Places {
private String image, name;
public Places() {
}
public Places(String image, String name) {
this.image = image;
this.name = name;
}
public String getImage() { return image; }
public String getName() { return name; }
}
自定义适配器:
class PlaceAdapter extends ArrayAdapter<Places> {
private ArrayList<Places> dataSet;
Context mContext;
private static class ViewHolder {
TextView name_text;
ImageView image_text;
}
public PlaceAdapter(ArrayList<Places> dataSet, Context context ) {
super(context, R.layout.item_list, dataSet);
this.dataSet = dataSet;
this.mContext = context;
}
@Override
public View getView(int position, View converView, ViewGroup parent) {
Places places = getItem(position);
ViewHolder viewHolder;
final View result;
if (converView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
converView = inflater.inflate(R.layout.item_list, parent, false);
viewHolder.name_text = (TextView) converView.findViewById(R.id.text_image_id);
viewHolder.image_text = (ImageView) converView.findViewById(R.id.image_id);
result = converView;
converView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) converView.getTag();
result = converView;
}
viewHolder.name_text.setText(places.getName());
Glide.with(getContext()).load(places.getImage()).into(viewHolder.image_text);
return converView;
第二个 Activity ,我传递数据:
public class Card_activity extends AppCompatActivity implements View.OnClickListener{
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.massive_places);
mTextView = findViewById(R.id.head_name);
String name = getIntent().getStringExtras("name")
mTextView.setText(name);
}
}
已编辑:错误
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.util.ArrayList.get(int)' on a null object reference
在这一行:
Places places = randomPlaceList.get(position);
错误:
Process: com.example.eugene.lafinalproduction, PID: 8352 java.lang.IllegalArgumentException: n <= 0: 0 at java.util.Random.nextInt(Random.java:182) at com.example.eugene.lafinalproduction.ListViewPlaces$1.onComplete(ListViewPlaces.java:63) at com.google.android.gms.tasks.zzj.run(Unknown Source) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5763) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
这一行的问题:
randomPlaceList.add(placesList.get(randomGenerator.nextInt(placeCount)));
最佳答案
该错误意味着您的 randomPlaceList
为 null。
由于我看不到应用程序或您为获取错误而执行的逻辑,所以我只是根据我所看到的进行操作。
首先,如果您需要获取单击的项目,应该通过调用 adapter< 的
;您可以像下面这样轻松地实现它:getItem(position)
方法来完成
@Override
public Places getItem(int position) {
if(dataSet != null && position < dataSet.size()){
return dataSet.get(position);
}
return null;
}
现在,从您的 activity
中,您可以简单地执行如下调用:
Places places = mAdapter.getItem(position);
请记住在初始化适配器时添加对适配器的引用,方法是在 Activity 变量中添加 PlaceAdapter mAdapter;
并将初始化替换为
mAdapter = new PlaceAdapter(randomPlaceList, getBaseContext());
mListView.setAdapter(mAdapter);
<小时/>
快速阅读代码,我也觉得这没有多大意义:
this.randomPlaceList = randomPlaceList;
但也许你删掉了一些代码,但我更愿意向你报告,以防万一:)
<小时/>注意指定错误
错误就在这里,它与变量引用有关:
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Places> placesList = new ArrayList<>();
for (DocumentSnapshot document : task.getResult()) {
Places place = document.toObject(Places.class);
placesList.add(place);
}
int placeCount = placesList.size();
Random randomGenerator = new Random();
// In the line below, you specify a new ArrayList that is LOCAL, you don't refer to the Activity's object
ArrayList<Places> randomPlaceList = new ArrayList<>();
for (int i = 1; i <= 3; i++) {
randomPlaceList.add(placesList.get(randomGenerator.nextInt(placeCount)));
}
ListView mListView = (ListView) findViewById(R.id.place_list);
PlaceAdapter placeAdapter = new PlaceAdapter(randomPlaceList, getBaseContext());
mListView.setAdapter(placeAdapter);
}
});
您应该将其替换为:
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Places> placesList = new ArrayList<>();
for (DocumentSnapshot document : task.getResult()) {
Places place = document.toObject(Places.class);
placesList.add(place);
}
int placeCount = placesList.size();
Random randomGenerator = new Random();
randomPlaceList = new ArrayList<>(); //this is the activity's list
for (int i = 1; i <= 3; i++) {
randomPlaceList.add(placesList.get(randomGenerator.nextInt(placeCount)));
}
ListView mListView = (ListView) findViewById(R.id.place_list);
PlaceAdapter placeAdapter = new PlaceAdapter(randomPlaceList, getBaseContext());
mListView.setAdapter(placeAdapter);
}
});
否则, Activity 的列表将始终为空,因为您从未初始化它
希望这有帮助
关于java - 无法从 ListView 通过 Intent 正确传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50256583/