Не удается правильно передать данные через Intent из ListView - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь передать элемент данных, выбранный в ListView, следующему Activity.Но все, что я могу, это то, что второе занятие пустое или ошибка nullpoinexception.Я сделал это с RecycleView, но с ListView возникли некоторые проблемы.

Основная деятельность:

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;

И вторая операция, где япередать данные:

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: попытка вызвать виртуальный метод 'java.lang.Object java.util.ArrayList.get (int) 'для пустой ссылки на объект

в этой строке:

Places places = randomPlaceList.get(position);

ОШИБКА:

Процесс: ком.example.eugene.lafinalproduction, PID: 8352 java.lang.IllegalArgumentException: n <= 0: 0 в java.util.Random.nextInt (Random.java:182) в com.example.eugene.lafinalproduction.ListViewPlaces $ 1.onComplete (ListViewPlaces.java:63) на com.google.android.gms.tasks.zzj.run (неизвестный источник) на android.os.Handler.handleCallback (Handler.java:815) на android.os.Handler.dispatchMessage (обработчик.Java: 104) на android.os.Looper.loop (Looper.java:207) на android.app.ActivityThread.main (ActivityThread.java:5763) на java.lang.reflect.Method.invoke (Native Method) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:789) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:679) </p>

1036* Проблема в этой строке:
randomPlaceList.add(placesList.get(randomGenerator.nextInt(placeCount)));

Ответы [ 4 ]

0 голосов
/ 09 мая 2018

Ошибка означает, что ваш randomPlaceList равен нулю.

Так как я не вижу приложение или логику, которую вы выполнили, чтобы получить ошибку, я просто основываюсь на том, что вижу.

Во-первых, если вам нужно получить выбранный элемент, то следует сделать, вызвав метод getItem(position) вашего adapter; Вы можете легко реализовать это, как показано ниже:

@Override
public Places getItem(int position) {
    if(dataSet != null && position < dataSet.size()){
       return dataSet.get(position);
    }
    return null;
}

Теперь со своего activity вы можете просто выполнить вызов, например:

Places places = mAdapter.getItem(position);

Не забудьте добавить ссылку на adapter при инициализации, добавив 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);                    
            }
        });

В противном случае список действий всегда будет нулевым, поскольку вы никогда его не инициируете

Надеюсь, это поможет

0 голосов
/ 09 мая 2018

В вашем коде есть несколько проблем. Но давайте просто сосредоточимся на вашем вопросе. Вы должны использовать

intent.getStringExtra 

для получения строковых данных из предыдущего действия вместо использования

intent.getExtras().getString("name");

getStringExtra и getExtras различаются.

0 голосов
/ 09 мая 2018

Инициализируйте вас randomPlaceList в вашем onCreate методе ListViewPlaces.

randomPlaceList = new ArrayList<>();

В настоящее время вы инициализируете randomPlaceList таким образом this.randomPlaceList = randomPlaceList;, что неправильно, поскольку вы назначаете одну и ту же копию randomPlaceList, например a = a .

И удалите локальную переменную ArrayList<Places> randomPlaceList = new ArrayList<>();, которая находится внутри query.get().addOnCompleteListener();

getIntent().getExtras() возвращает Bundle со значениями в парах Key-Value (Вы можете добавить несколько значений пары Key-Value в Bundle), но вы не являетесь проходя Bundle, вы передаете просто одну Key-Value пару. Поэтому предпочтительно звонить getStringExtra("name") в вашем Card_activity.

String name = getIntent().getStringExtra("name");

вместо

String name = getIntent().getExtras().getString("name");
0 голосов
/ 09 мая 2018

Во втором упражнении измените это:

String name = getIntent().getExtras().getString("name");

Кому:

String name = getIntent().getStringExtra("name");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...