Невозможно отобразить тост в OnItemClickListener внутри фрагмента
Я пытаюсь создать ListView
в Fragment
, ListView отображается правильно, но когда я соблюдает код показывает ошибку.
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class ServiceFragment extends Fragment {
private ListView serviceList;
private String[] serviceString;
public ServiceFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_service, container, false);
//build the list service
serviceList = (ListView) rootView.findViewById(R.id.ServiceList);
serviceString = getResources().getStringArray(R.array.service_list);
ArrayAdapter<String> objAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1,serviceString );
serviceList.setAdapter(objAdapter);
//on click item Listener
serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itemValue = (String) serviceList.getItemAtPosition(position);
int itemPosition = position;
Toast.makeText(ServiceFragment.this,"Position :"+itemPosition+" ListItem : " +itemValue , Toast.LENGTH_LONG).show();
}
});
return rootView;
}//end of onCreateView
}//end of class ServiceFragment
Что не так с моим кодом? Почему не Toast
объявиться?
Можно ли при щелчке элемента начать детальное действие, где я могу описать значение элемента?
Предположим, что элемент списка = Apple,Mango, Banana onClick Детальный вид элемента = Apple - это бренд или фрукт, Banana - это фрукт, Mango - хороший фрукт,
2 ответа
Что не так с моим кодом? Почему тост не показывает
Так как вы находитесь на Fragment
ты должен использовать getActivity()
вместо yourClass.this
,
Измени свой Toast
к этому:
Toast.makeText(getActivity(),"Position :"+itemPosition+" ListItem : " +itemValue , Toast.LENGTH_LONG).show();
РЕДАКТИРОВАТЬ
Для подробного действия вы должны создать Activity
сначала давайте назовем это DetailActivity
тогда вы должны изменить свой onItemClickListener()
к этому:
serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itemValue = (String) serviceList.getItemAtPosition(position);
int itemPosition = position;
Toast.makeText(getActivity(),"Position :"+itemPosition+" ListItem : " +itemValue , Toast.LENGTH_LONG).show();
Intent intent = new Intent(getActivity(), DetailActivity.class);
intent.putExtra("DetailProductClicked", itemValue);
startActivity(intent);
}
});
Так в вашем DetailActivity.class
Вы должны положить это на свой onCreate()
String nameFruit = intent.getStringExtra("DetailProductClicked");
Тогда зависит, что у вас есть на это Activity
Вы можете сделать что-то вроде:
if (nameFruit.equals("Apple"){
tv.setText(nameFruit +" is a brand or fruit");
}
if (nameFruit.equals("Mango"){
tv.setText(nameFruit +" is a good fruit");
}
if (nameFruit.equals("Banana"){
tv.setText(nameFruit +" is a fruit");
}
Чтобы отслеживать ответ @Skizo, измените свой onItemClick на
serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itemValue = (String) serviceList.getItemAtPosition(position);
int itemPosition = position;
Intent nextIntent = new Intent(getActivity(), MyNextActivity.class);
// ... create a bundle to pass of the Object in your data at itemPosition
startActivity(nextIntent);
}
});
Реально, хотя я бы использовал интерфейс во Фрагменте, как это было бы, и сказал бы моей Активности, чтобы начать новую Активность, а не фрагмент:
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class ServiceFragment extends Fragment {
private ListView serviceList;
private String[] serviceString;
private ItemListener mCallback;
public ServiceFragment(){}
public interface ItemListener{
// use position or Object data here
void onItemClicked(int position);
}
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
mCallback = (ItemListener) activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_service, container, false);
//build the list service
serviceList = (ListView) rootView.findViewById(R.id.ServiceList);
serviceString = getResources().getStringArray(R.array.service_list);
ArrayAdapter<String> objAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1,serviceString );
serviceList.setAdapter(objAdapter);
//on click item Listener
serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itemValue = (String) serviceList.getItemAtPosition(position);
int itemPosition = position;
mCallback.onItemClicked(itemPosition);
}
});
return rootView;
}//end of onCreateView
}//end of class ServiceFragment
а затем добавить implements ServiceFragment.ItemListener
в вашей деятельности:
@Override
public void onItemClicked(int position){
// Now handling this element via the Activity, much cleaner
Intent nextIntent = new Intent(this, MyNextActivity.class);
// ... create a bundle to pass of the Object in your data at itemPosition
startActivity(nextIntent);
}