OnClickListener не работает с фрагментами - PullRequest
0 голосов
/ 20 февраля 2019

Я не могу заставить onclicklistener работать с fragments.Я искал stackoverflow и перепробовал все советы, но я все еще не могу заставить его работать.Итак, я делаю свой первый пост здесь.Я попытался добавить android: focusable = "false", android: clickable = "false" и android: DesndantFocusability = "blocksDescendants" без удачи.Я удалил их, потому что они не имеют значения.Я пробовал и другие решения, но ни одно из них не работает.Это мой первый пост, так что если я написал что-то не так, дайте мне знать и переделайте, я кое-что позаимствовал customlist, чтобы получить рабочий пример.
Вот один из фрагментов, который мне нужен для кликабельного списка в

public class ActivitiesFragment extends Fragment {
    ListView list;

    String[] maintitle ={
            "Aktivitet 1","Aktivitet 2",
            "Aktivitet 3","Aktivitet 4",
            "Aktivitet 5",
    };

    String[] subtitle ={
            "A","B",
            "C","D",
            "E",
    };

    Integer[] imgid={
            R.drawable.ic_dashboard_black_24dp,R.drawable.ic_dashboard_black_24dp,
            R.drawable.ic_dashboard_black_24dp,R.drawable.ic_dashboard_black_24dp,
            R.drawable.ic_dashboard_black_24dp,
    };

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

        MyListAdapter adapter = new MyListAdapter(getActivity(), maintitle, subtitle,imgid);

        list = (ListView) rootView.findViewById(R.id.list);
        list.setAdapter(adapter);

        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(position == 0) {
                    Toast.makeText(getActivity().getApplicationContext(),"One",Toast.LENGTH_SHORT).show();
                }
                else if(position == 1) {
                    Toast.makeText(getActivity().getApplicationContext(),"Two",Toast.LENGTH_SHORT).show();
                }
                else if(position == 2) {
                    Toast.makeText(getActivity().getApplicationContext(),"Three",Toast.LENGTH_SHORT).show();
                }
                else if(position == 3) {
                    Toast.makeText(getActivity().getApplicationContext(),"Four",Toast.LENGTH_SHORT).show();
                }
                else if(position == 4) {
                    Toast.makeText(getActivity().getApplicationContext(),"Five",Toast.LENGTH_SHORT).show();
                }
            }
        });

        return rootView;
    }
}

Адаптер:

public class MyListAdapter extends ArrayAdapter<String> {
    private final Activity context;
    private final String[] maintitle;
    private final String[] subtitle;
    private final Integer[] imgid;

    public MyListAdapter(Activity context, String[] maintitle,String[] subtitle, Integer[] imgid) {
        super(context, R.layout.mylist, maintitle);
        // TODO Auto-generated constructor stub

        this.context=context;
        this.maintitle=maintitle;
        this.subtitle=subtitle;
        this.imgid=imgid;
    }

    public View getView(int position,View rowView,ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        rowView = inflater.inflate(R.layout.mylist, null,true);


        TextView titleText = (TextView) rowView.findViewById(R.id.title);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
        TextView subtitleText = (TextView) rowView.findViewById(R.id.subtitle);

        titleText.setText(maintitle[position]);
        imageView.setImageResource(imgid[position]);
        subtitleText.setText(subtitle[position]);

        return rowView;
    }
}

XML для фрагмента:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp"/>
</RelativeLayout>

xml для списка:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:padding="5dp"/>
    <LinearLayout android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Medium Text"
            android:textStyle="bold"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="5dp"
            android:padding="2dp"
            android:textColor="#4d4d4d" />
        <TextView
            android:id="@+id/subtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView"
            android:layout_marginLeft="10dp" />
    </LinearLayout>
</LinearLayout>

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вот полная реализация RecyclerView со слушателем щелчка элемента.

Фрагмент:

public class MyFragment extends Fragment implements ItemClickListener {

    RecyclerView rvList;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_activities, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        rvList = view.findViewById(R.id.rvList);

        ArrayList<ItemData> list = new ArrayList<>();
        list.add(new ItemData("Aktivitet 1","A",R.drawable.ic_dashboard_black_24dp))
        list.add(new ItemData("Aktivitet 2","B",R.drawable.ic_dashboard_black_24dp))
        list.add(new ItemData("Aktivitet 3","C",R.drawable.ic_dashboard_black_24dp))
        list.add(new ItemData("Aktivitet 4","D",R.drawable.ic_dashboard_black_24dp))
        list.add(new ItemData("Aktivitet 5","E",R.drawable.ic_dashboard_black_24dp))

        RVAdapter adapter = new RVAdapter(this, list);
        rvList.setLayoutManager(new LinearLayoutManager(getContext()));
        rvList.setAdapter(adapter);
    }

    @Override
    public void onItemClicked(ItemData data, int position) {
        // item click will be listened here
        Toast.makeText(getContext(), String.valueOf(position), Toast.LENGTH_SHORT).show();
    }
}

Макет фрагмента: frag.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvList"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

Макет для списка: item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:padding="5dp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="5dp"
            android:padding="2dp"
            android:text="Medium Text"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#4d4d4d"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/subtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="TextView" />
    </LinearLayout>
</LinearLayout>

RecyclerViewViewHolder:

public class RecyclerVH extends RecyclerView.ViewHolder {

    private TextView titleText;
    private ImageView imageView;
    private TextView subtitleText;

    public RecyclerVH(@NonNull View itemView) {
        super(itemView);
        titleText = itemView.findViewById(R.id.title);
        imageView = itemView.findViewById(R.id.icon);
        subtitleText = itemView.findViewById(R.id.subtitle);
    }

    void bind(ItemData data) {
        titleText.setText(data.getMainTitle());
        imageView.setImageResource(data.getImgId());
        subtitleText.setText(data.getSubTitle());
    }
}

Адаптер RecyclerView:

public class RVAdapter extends RecyclerView.Adapter<RecyclerVH> {

    private ArrayList<ItemData> list;
    private ItemClickListener listener;

    public RVAdapter(ItemClickListener listener, ArrayList<ItemData> list) {
        this.list = list;
        this.listener = listener;
    }

    @NonNull
    @Override
    public RecyclerVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new RecyclerVH(LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull final RecyclerVH holder, int position) {
        holder.bind(list.get(position));
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClicked(list.get(holder.getAdapterPosition()),
                        holder.getAdapterPosition());
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
}

interface ItemClickListener {
    void onItemClicked(ItemData data, int position);
}

Обновление 1:

Добавьте эти строки в корневой тег макета элемента:

 android:focusable="true"
 android:clickable="true"

Как это:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:clickable="true"
    android:orientation="horizontal">

    ...
</LinearLayout>
0 голосов
/ 20 февраля 2019

Время назад у меня была похожая проблема с ImageView в моем элементе списка.Мое решение меняло значение android:focusable на false внутри блока ImageView.Я никогда не знал почему, но это работало нормально.

В любом случае, я настоятельно рекомендую начать использовать RecyclerView и ViewHolder pattern.https://developer.android.com/guide/topics/ui/layout/recyclerview

Это гораздо более мощный, гибкий и существенный инструмент по сравнению с ListView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...