Как получить дочерние узлы из данных, которые я вставил в Listview?

#java #android

#java #Android

Вопрос:

Я создал Listview и вставил в него данные из моей базы данных SQLite. onItemClick в Listview открывает другой фрагмент, но я могу получить доступ только к имени, отображаемому в ListItem. Как мне получить остальные данные?

Используя getItemAtPosition(позиция).toString(); работает для выбранного элемента, но не для остальных данных. getChildAt(позиция).toString(); тоже не работает. Я также пробовал использовать StringBuffer, но не смог заставить его работать (возможно, я сделал это неправильно). Кто-нибудь может мне здесь помочь?

 public class FoodFragment extends Fragment {


    ImageButton addFood;
    ListView listView;
    FoodDatabaseHelper mFoodDatabaseHelper;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_food, container, false);

        addFood = view.findViewById(R.id.addFood);
        listView = view.findViewById(R.id.caloriesEaten);
        mFoodDatabaseHelper = new FoodDatabaseHelper(getActivity());

        populateListview();


        return view;
    }

    private void populateListview(){
        //populate an ArrayList<String> from the database and then view it
        ArrayList<String> list = new ArrayList<>();
        Cursor data = mFoodDatabaseHelper.getData();
        if(data.getCount() == 0){
            Toast.makeText(getActivity(), "There are no contents in this list!",Toast.LENGTH_LONG).show();
        }else{
            while(data.moveToNext()){
                list.add(data.getString(1));
                ListAdapter listAdapter = new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,list);
                listView.setAdapter(listAdapter);

                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                            //Get data from Listview
                            String food = parent.getItemAtPosition(position).toString();
                            String protein = listView.getChildAt(position).toString();
                            String fats = listView.getChildAt(position).toString();
                            String carbo = listView.getChildAt(position).toString();

                            Cursor data = mFoodDatabaseHelper.getFood(food);
                            int itemID = -1;
                            while (data.moveToNext()){
                                itemID = data.getInt(0);
                            }
                            if(itemID > -1){
                                FoodDetailFragment frt = new FoodDetailFragment();
                                FragmentTransaction transaction = getFragmentManager().beginTransaction();

                                //Send the relevant data to the FoodDetailFragment
                                Bundle bundle = new Bundle();
                                bundle.putString("foods", food);
                                bundle.putString("protein", protein);
                                bundle.putString("fats", fats);
                                bundle.putString("carbo", carbo);
                                frt.setArguments(bundle);
                                transaction.replace(R.id.fragment_container, frt);
                                transaction.addToBackStack(null).commit();

                            }else{
                                Toast.makeText(getActivity(), "No such ID ", Toast.LENGTH_LONG).show();
                            }
                    }
                });
            }
        }
    }
}
  

Следующий фрагмент должен показывать название продукта питания и макросы, например:

 Bacon

1

0

18
  

Вместо этого он отображает:

 Bacon 

android.support.v7.widget.AppcompatTextView{82d2539V.ED..... ..... 0
0-974,123£1020014android:id/text1}

android.support.v7.widget.AppcompatTextView{82d2539V.ED..... ..... 0
0-974,123£1020014android:id/text1}

android.support.v7.widget.AppcompatTextView{82d2539V.ED..... ..... 0
0-974,123£1020014android:id/text1}
  

Я не могу понять, как указать на значение. Любая помощь была бы очень благодарна.

РЕДАКТИРОВАТЬ: теперь я изменил код, пытаясь перейти по предоставленной ссылке. Это привело к тому, что я смог получить дочерние узлы. В итоге я получил это. Это не красиво, но это работает.

 public class FoodFragment extends Fragment {

    String food, proteins, fats, carbohydrates;
    ImageButton addFood;
    FoodDatabaseHelper foodDatabaseHelper;
    ListView listView;
    SQLiteDatabase sqLiteDatabase;
    ArrayList<HashMap<String, String>> foodlist;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_food, container, false);

        addFood = view.findViewById(R.id.addFood);
        listView = view.findViewById(R.id.caloriesEaten);
        foodDatabaseHelper = new FoodDatabaseHelper(getActivity());
        sqLiteDatabase = foodDatabaseHelper.getWritableDatabase();


        addFood.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TrackingFragment frt = new TrackingFragment();
                FragmentTransaction transaction = getFragmentManager().beginTransaction();
                transaction.replace(R.id.fragment_container, frt);
                transaction.addToBackStack(null).commit();
            }
        });

        foodlist = new ArrayList<>();
        populateListview();

        return view;
    }

    private void populateListview() {

        Cursor cursor = foodDatabaseHelper.getData();
        foodlist.clear();
        if (cursor.getCount() > 0) {
            cursor.moveToFirst();
            for (int i = 0; i < cursor.getCount(); i  ) {
                food = cursor.getString(1);
                proteins = cursor.getString(2);
                fats = cursor.getString(3);
                carbohydrates = cursor.getString(4);

                HashMap<String, String> foods = new HashMap<>();
                foods.put("foods", food);
                foods.put("proteins", proteins);
                foods.put("fats", fats);
                foods.put("carbohydrates", carbohydrates);
                foodlist.add(foods);
                cursor.moveToNext();

            }
            ListAdapter adapter = new SimpleAdapter(getActivity(), foodlist, R.layout.fragment_food_items, new String[]{"foods", "proteins", "fats", "carbohydrates"}, new int[]{R.id.food, R.id.proteins, R.id.fats, R.id.carbs});
            listView.setAdapter(adapter);
        }
    }
  

Ответ №1:

В вашем коде есть несколько серьезных проблем :

  1. Не инициализируйте адаптер listview и OnItemClickListener() внутри цикла while. Они должны быть вне цикла.

  2. Если вы хотите получить все данные в позиции при нажатии на listitem, тогда вам следует создать класс и сохранить объекты этого класса в вашем списке вместо просто строки.

По этой ссылке есть некоторый код, который поможет вам исправить вашhttps://www.dev2qa.com/how-to-show-data-from-sqlite-database-in-android-listview /

Комментарии:

1. Дайте мне знать, если у вас возникли какие-либо проблемы. И если это решило вашу проблему, пожалуйста, отметьте это как ответ для других.

2. Обновить. С помощью этой ссылки и некоторых других материалов я заставил ее работать. Спасибо за вашу помощь!