只有在活动重新启动后,Recyclerview onClick才会工作。

问题描述 投票:0回答:1

我的android应用中存在一个奇怪的bug,我有一个带回收视图适配器的home片段,实现了一个点击监听器的接口:在物理设备上(不是模拟器),它只有在重启应用或进入其他片段后才能工作,然后返回home片段。我有一个带回收器视图适配器的主片段,实现了一个点击监听器的接口:在物理设备上(不是模拟器),它只有在重启应用程序或转到其他片段后才会工作,然后返回主片段:在那之后,它可以工作。该监听器在我的应用程序中的其他回收器视图适配器中实现,并在其他方面正常工作。我已经尝试了CardViews中的每一个可点击和可聚焦的truefalse组合,这些组合都代表了我的列表中的一个项目,但没有任何工作。"谢谢你的帮助!(我在运行应用程序时没有错误)。

编辑我发现了一个问题:第一次启动应用程序时,我用MainActivity中的requestManifestPermissions()方法询问地点权限:当用户接受或拒绝后,适配器中的OnClick结束工作。有什么建议吗?

适配器代码。

public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private String[] names = {
        "Ristoranti",
        "Bar",
        "Hotel",
        "Coffee",
        "Cinema",
        "Gelaterie",
        "Barbieri",
        "Pizzerie",
        "Banche",
        "Parking",
        "Ospedali",
        "Musei",
        "Supermercati",
        "Birrerie",
        "Farmacie"
};

private int[] images = {
        R.drawable.food,
        R.drawable.bar,
        R.drawable.hotel,
        R.drawable.coffee,
        R.drawable.cinema,
        R.drawable.icecream,
        R.drawable.barber,
        R.drawable.pizza,
        R.drawable.bank,
        R.drawable.parking,
        R.drawable.hospital,
        R.drawable.museum,
        R.drawable.supermarket,
        R.drawable.beer,
        R.drawable.pharma
};

private OnItemClickListener onClickListener;

public HomeAdapter() {

}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = 
    LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_home, 
    parent, false);
    return new MenuHolder(view, onClickListener);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    MenuHolder viewHolder = (MenuHolder) holder;
    viewHolder.displayView(names[position], images[position]);
}

@Override
public int getItemCount() {
    return names.length;
}

public void setOnClickListener(OnItemClickListener listener) {
    onClickListener = listener;
}

public String getItem(int position) {
    return names[position];
}

HomeFragment(使用适配器)代码。

public class HomeFragment extends Fragment {

private static final int REQUEST_FINE_LOCATION = 1;
private boolean isLocationEnabled;

private RecyclerView recyclerView;

public HomeFragment() {

}

@Nullable
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
    View view = inflater.inflate(R.layout.fragment_recyclerview, container, false);
    isLocationEnabled = checkPermissions();
    recyclerView = view.findViewById(R.id.recyclerview_fav);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(requireContext());
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setHasFixedSize(true);
    return view;
}

@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
    // Adapter
    HomeAdapter homeAdapter = new HomeAdapter();
    recyclerView.setAdapter(homeAdapter);
    homeAdapter.setOnClickListener((v, position) -> {
        if (isLocationEnabled) {
            NavController controller = Navigation.findNavController(requireActivity(), navHo
            Bundle bundle = new Bundle();
            bundle.putString("type", homeAdapter.getItem(position));
            bundle.putBoolean("nearby", true);
            controller.navigate(R.id.nearbyFragment, bundle);
        } else {
            requestPermissions();
        }
    });
}

MainActivity(我使用的是单活动架构)

public class MainActivity extends AppCompatActivity {

private DrawerLayout drawerLayout;
private NavigationView navigationView;
private AppBarConfiguration appBarConfiguration;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar5);
    setSupportActionBar(toolbar);

    drawerLayout = findViewById(R.id.drawer);
    navigationView = findViewById(R.id.navigation_view);

    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);

    appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph())
            .setOpenableLayout(drawerLayout)
            .build();
    NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration);

    navigationView.setNavigationItemSelectedListener(menuItem -> {
        int id = menuItem.getItemId();
        if (id == R.id.fav) {
            navController.navigate(R.id.favouritesFragment);
        } else if (id == R.id.search) {
            AlertDialog.Builder builder = 
                new AlertDialog.Builder(MainActivity.this, 
          R.style.MyAlertDialogStyle);
            SpannableString title = new SpannableString("Cerca");
            title.setSpan(new ForegroundColorSpan(
           Color.parseColor("#2565AE")), 0, title.length(), 
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            builder.setTitle(title);
            final EditText input = new EditText(MainActivity.this);
            input.setInputType(InputType.TYPE_CLASS_TEXT);
            builder.setView(input);
            builder.setPositiveButton("OK", (dialog, which) -> {
                Bundle bundle = new Bundle();
                bundle.putString("type", input.getText().toString());
                bundle.putBoolean("nearby", false);
                navController.navigate(R.id.nearbyFragment, bundle);
                Toast.makeText(MainActivity.this, input.getText().toString(),          
            Toast.LENGTH_SHORT).show();
            });
            builder.setNegativeButton("Cancel", (dialog, which) -> dialog.cancel());
            builder.show();
        } else if (id == R.id.setting) {
            navController.navigate(R.id.settingsFragment);
        } else if (id == R.id.home) {
            navController.navigate(R.id.homeFragment);
        } else if (id == R.id.bookmarks) {
            navController.navigate(R.id.bookmarksFragment);
        } else if (id == R.id.map) {
            navController.navigate(R.id.mapFragment);
        }
        new Handler().postDelayed(() -> drawerLayout.closeDrawer(navigationView), 200);
        return false;
    });
}

@Override
public boolean onSupportNavigateUp() {
    NavController navController = Navigation.findNavController(this,                    
     R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, appBarConfiguration)
            || super.onSupportNavigateUp();
}

@Override
public void onBackPressed() {
    if (drawerLayout.isDrawerOpen(navigationView)) {
        drawerLayout.closeDrawer(navigationView);
    } else {
        super.onBackPressed();
    }
}

项目布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardview_home"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardElevation="5dp"
card_view:cardUseCompatPadding="true"
android:foreground="?android:attr/selectableItemBackground"
android:background="@color/quantum_white_100"
android:clickable="true"
android:focusable="false">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="false"
    android:focusable="false"
    android:padding="8dp">
    <ImageView
        android:focusable="false"
        android:clickable="false"
        android:layout_marginTop="8dp"
        android:id="@+id/image"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:paddingBottom="5dp"
        android:paddingTop="5dp"
        tools:ignore="ContentDescription" />
    <TextView
        android:focusable="false"
        android:clickable="false"
        android:paddingBottom="5dp"
        android:paddingTop="5dp"
        android:id="@+id/type"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginStart="12dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:layout_toEndOf="@+id/image"
        android:maxLines="1"
        android:textSize="25sp"
        android:textStyle="bold"
        android:theme="@style/HomeListViewTheme"
        tools:ignore="HardcodedTextRtlHardcoded" />
 </RelativeLayout>

  </androidx.cardview.widget.CardView>

家里零碎的布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerview_fav"
    android:layout_width="match_parent"
    android:background="@color/ghostwhite"
    android:layout_height="match_parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="parent" />

  </androidx.constraintlayout.widget.ConstraintLayout>

主要活动布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout

xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout

    android:id="@+id/main_container"
    android:orientation="vertical"
    android:layout_height="wrap_content"
    android:layout_width="match_parent">

    <androidx.appcompat.widget.Toolbar

        android:id="@+id/toolbar5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ToolbarTheme"
        app:titleTextAppearance="@style/ToolbarTheme" />

    <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar5"
        android:orientation="horizontal">

        <fragment
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:navGraph="@navigation/nav_graph"
            tools:ignore="FragmentTagUsage" />

    </LinearLayout>

</LinearLayout>

<com.google.android.material.navigation.NavigationView
    app:headerLayout="@layout/nav_header"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:menu="@menu/nav_menu"
    app:itemTextAppearance="@style/MyMenu"
    android:layout_gravity="start"
    android:id="@+id/navigation_view" />

</androidx.drawerlayout.widget.DrawerLayout>

MenuHolder类

public class MenuHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

private OnItemClickListener listener;

@BindView(R.id.type)
TextView name;
@BindView(R.id.image)
ImageView img;

public MenuHolder(View itemView, OnItemClickListener listener) {
    super(itemView);
    ButterKnife.bind(this, itemView);
    itemView.setOnClickListener(this);
    this.listener = listener;
}

public void displayView(String type, int image) {
    name.setText(type);
    img.setImageResource(image);
}

public void onClick(View view) {
    listener.onClick(view, getAdapterPosition());
}

}

接口OnItemClickListener

public interface OnItemClickListener {

void onClick(View view, int position);

}

android android-fragments android-recyclerview
1个回答
0
投票

制作自己的 OnCLickListener:

public interface RecyclerViewClickListener {
        void recyclerViewListClicked(View v, int position);
    } 

记得在你的适配器类中创建它的实例。

RecyclerViewClickListener itemClickListsner;

创建您的自定义 ViewHolder 类,现在你可以通过你的`RecyclerViewClickListener'来实现。

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        // your fields here


        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            // get fields from XML by findViewById()

           itemView.setOnClickListener(this);

        }

        @Override
        public void onClick(View view) {
            itemClickListener.recyclerViewListClicked(itemView, this.getLayoutPosition());
        }
    }

现在你可以把你的 "RecyclerViewClickListener

public HomeAdapter(RecyclerViewClickListener clickListener) {

     this.itemClickListener = clickListener;

}

而在Actitivy内部。

HomeAdapter(new RecyclerViewClickListener() {
            @Override
            public void recyclerViewListClicked(View view, int position) {

        });
© www.soinside.com 2019 - 2024. All rights reserved.