Передача данных из фрагмента в действие с помощью listview

#android #fragment

#Android #фрагмент

Вопрос:

У меня есть этот код с помощью Android Studio, пытаюсь отправить данные из фрагмента в действие, но я получаю ошибку. Я использую CardView со списком, но когда я пытаюсь получить дополнительную информацию из фрагмента при нажатии ListView , это выдает ошибку, и приложение вылетает.

PlacesFragment:

 public class PlacesFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.list_view, container, false);
        final ArrayList<Word> words = new ArrayList<Word>();
        words.add(new Word(R.string.place1,R.string.about1,R.string.address1,R.string.time1,R.drawable.medinam1));
        words.add(new Word(R.string.place2,R.string.about2,R.string.address2,R.string.time2,R.drawable.medinam2));
        words.add(new Word(R.string.place3,R.string.about3,R.string.address3,R.string.time3,R.drawable.medinam3));



        WordAdapter adapter = new WordAdapter(getActivity(), words);
        ListView listView = (ListView)rootView.findViewById(R.id.listView);
        listView.setAdapter(adapter);


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Word clickedCard = (Word) parent.getItemAtPosition(position);
                //Intent intent = new Intent(PlacesFragment.this, InformationActivity.class);
                Intent intent = new Intent(getActivity(),InformationActivity.class);
                intent.putExtra("pic_name", clickedCard.getImage());
                intent.putExtra("info_name", clickedCard.getName());
                intent.putExtra("some_information", clickedCard.getInfo());
                intent.putExtra("addressTextView", clickedCard.getAddress());
                intent.putExtra("timeTextView", clickedCard.getTime());
                startActivity(intent);
            }
        });
        return rootView;
    }

}
  

Информационная активность:

 public class InformationActivity extends AppCompatActivity {

    private ImageView imageView;
    private TextView nameOfpic;
    private TextView nameOfInfo;
    private TextView nameOfAdress;
    private TextView nameOfTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_information);

        imageView = findViewById(R.id.pic_name);
        nameOfpic =  findViewById(R.id.info_name);
        nameOfInfo = findViewById(R.id.some_information);
        nameOfAdress =  findViewById(R.id.addressTextView);
        nameOfTime =  findViewById(R.id.timeTextView);

        Intent intent = getIntent();
        imageView.setImageResource(intent.getIntExtra("pic_name",R.id.pic_name));
        nameOfpic.setText(intent.getStringExtra("info_name"));
        nameOfInfo.setText(intent.getStringExtra("some_information"));
        nameOfAdress.setText(intent.getStringExtra("addressTextView"));
        nameOfTime.setText(intent.getStringExtra("timeTextView"));

    }
}
  

Ответ №1:

Вы можете запустить действие из фрагмента таким образом, и вам это не нужно, потому что действие уже существует и содержит фрагмент.

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

 public interface PlacesInterface {
    void onListViewItemClicked(Word word);
}
  

Затем вы реализуете этот интерфейс с помощью InformationActivity следующим образом:

 public class InformationActivity extends AppCompatActivity implements PlacesInterface {

    private ImageView imageView;
    private TextView nameOfpic;
    private TextView nameOfInfo;
    private TextView nameOfAdress;
    private TextView nameOfTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_information);

        imageView = findViewById(R.id.pic_name);
        nameOfpic =  findViewById(R.id.info_name);
        nameOfInfo = findViewById(R.id.some_information);
        nameOfAdress =  findViewById(R.id.addressTextView);
        nameOfTime =  findViewById(R.id.timeTextView);

        Intent intent = getIntent();
                imageView.setImageResource(intent.getIntExtra("pic_name",R.id.pic_name));
        nameOfpic.setText(intent.getStringExtra("info_name"));
        nameOfInfo.setText(intent.getStringExtra("some_information"));
        nameOfAdress.setText(intent.getStringExtra("addressTextView"));
        nameOfTime.setText(intent.getStringExtra("timeTextView"));

    }
    @Override
    public void onDataStateChange(Word word) {
        //Do what you want inside the activity with data passed from the clicked Item
    }
}
  

И, наконец, внутри PlacesFragment выполните следующее:

 public class PlacesFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.list_view, container, false);
        final ArrayList<Word> words = new ArrayList<Word>();
        words.add(new Word(R.string.place1,R.string.about1,R.string.address1,R.string.time1,R.drawable.medinam1));
        words.add(new Word(R.string.place2,R.string.about2,R.string.address2,R.string.time2,R.drawable.medinam2));
        words.add(new Word(R.string.place3,R.string.about3,R.string.address3,R.string.time3,R.drawable.medinam3));

        WordAdapter adapter = new WordAdapter(getActivity(), words);
        ListView listView = (ListView)rootView.findViewById(R.id.listView);
        listView.setAdapter(adapter);


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Word clickedCard = (Word) parent.getItemAtPosition(position);
                //HERE IS THE NEW PART, PAY ATTENTION
                ((PlacesInterface)getActivity).onListViewItemClicked(clickedWord);
            }
        });
        return rootView;
    }
}
  

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

1. Например: что вы имеете в виду под этим: @Override public void onDataStateChange(Word word) { //Делайте то, что вы хотите внутри действия с данными, переданными из выбранного элемента} и внутри фрагмента PlacesFragment, где передаются данные?

Ответ №2:

Получите элемент по позиции из вашего адаптера в прослушивателе щелчков элемента….Попробуйте это….

 public class PlacesFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.list_view, container, false);
    final ArrayList<Word> words = new ArrayList<Word>();
    words.add(new Word(R.string.place1,R.string.about1,R.string.address1,R.string.time1,R.drawable.medinam1));
    words.add(new Word(R.string.place2,R.string.about2,R.string.address2,R.string.time2,R.drawable.medinam2));
    words.add(new Word(R.string.place3,R.string.about3,R.string.address3,R.string.time3,R.drawable.medinam3));



    final WordAdapter adapter = new WordAdapter(getActivity(), words);
    ListView listView = (ListView)rootView.findViewById(R.id.listView);
    listView.setAdapter(adapter);


    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Word clickedCard = adapter.getItem(position);
            //Intent intent = new Intent(PlacesFragment.this, InformationActivity.class);
            Intent intent = new Intent(getActivity(),InformationActivity.class);
            intent.putExtra("pic_name", clickedCard.getImage());
            intent.putExtra("info_name", clickedCard.getName());
            intent.putExtra("some_information", clickedCard.getInfo());
            intent.putExtra("addressTextView", clickedCard.getAddress());
            intent.putExtra("timeTextView", clickedCard.getTime());
            startActivity(intent);
        }
    });
    return rootView;
}