#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:
В вашем коде есть несколько серьезных проблем :
-
Не инициализируйте адаптер listview и OnItemClickListener() внутри цикла while. Они должны быть вне цикла.
-
Если вы хотите получить все данные в позиции при нажатии на listitem, тогда вам следует создать класс и сохранить объекты этого класса в вашем списке вместо просто строки.
По этой ссылке есть некоторый код, который поможет вам исправить вашhttps://www.dev2qa.com/how-to-show-data-from-sqlite-database-in-android-listview /
Комментарии:
1. Дайте мне знать, если у вас возникли какие-либо проблемы. И если это решило вашу проблему, пожалуйста, отметьте это как ответ для других.
2. Обновить. С помощью этой ссылки и некоторых других материалов я заставил ее работать. Спасибо за вашу помощь!