我在一个项目上工作,这需要使用回收器视图显示列表项目。此外,每个项目都必须在单击事件上执行。这就是我所做的。
片段:
import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.stutee.bakingapp.utils.NetworkUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.net.URL;
import butterknife.BindView;
import butterknife.ButterKnife;
public class RecipeListFragment extends Fragment implements LoaderManager.LoaderCallbacks<String> {
private static final int LOADER_ID = 10;
@BindView(R.id.rv_recipe_list) RecyclerView mRecyclerView;
public RecipeAdapter mAdapter;
String[] parsedRecipeName;
public RecipeListFragment() { }
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_recipe_list, container, false);
ButterKnife.bind(this,rootView);
mAdapter = new RecipeAdapter(getContext());
int spanCount = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2;
GridLayoutManager layoutManager
= new GridLayoutManager(getContext(),spanCount);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setAdapter(mAdapter);
Bundle bundleForLoader = new Bundle();
getLoaderManager().initLoader(LOADER_ID, bundleForLoader,this);
return rootView;
}
@NonNull
@Override
public Loader<String> onCreateLoader(int id, @Nullable Bundle args) {
return new AsyncTaskLoader<String>(getContext()) {
String mRecipeJsonResult;
@Override
protected void onStartLoading() {
if (mRecipeJsonResult != null) {
deliverResult(mRecipeJsonResult);
} else {
forceLoad();
}
}
@Override
public String loadInBackground() {
String s = "https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/baking.json";
URL recipeRequestUrl = NetworkUtils.buildUrl(s);
try {
String jsonRecipeResponse = NetworkUtils
.getResponseFromHttpUrl(recipeRequestUrl);
return jsonRecipeResponse;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void deliverResult(String data) {
mRecipeJsonResult = data;
super.deliverResult(data);
}
};
}
@Override
public void onLoadFinished(@NonNull Loader<String> loader, String data) {
final String SHOW_NAME = "name";
try {
JSONArray jsonArray = new JSONArray(data);
parsedRecipeName = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String recipeNameString = jsonObject.getString(SHOW_NAME);
parsedRecipeName[i] = recipeNameString;
}
} catch (JSONException e) {
e.printStackTrace();
}
mAdapter.setRecipeName(parsedRecipeName);
}
@Override
public void onLoaderReset(@NonNull Loader<String> loader) {
}
}
适配器:
package com.example.stutee.bakingapp;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import butterknife.BindView;
import butterknife.ButterKnife;
public class RecipeAdapter extends RecyclerView.Adapter<RecipeAdapter.RecipeAdapterViewHolder> {
private String[] mRecipeName;
public interface RecipeAdapterOnClickHandler{
void onClick(String name);
}
public RecipeAdapterOnClickHandler mClickHandler;
public RecipeAdapter(RecipeAdapterOnClickHandler clickHandler){
mClickHandler = clickHandler;
}
@NonNull
@Override
public RecipeAdapter.RecipeAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context context = parent.getContext();
int layoutIdForListItem = R.layout.recipe_list_item;
LayoutInflater inflater = LayoutInflater.from(context);
boolean shouldAttachToParentImmediately = false;
View view = inflater.inflate(layoutIdForListItem, parent, shouldAttachToParentImmediately);
return new RecipeAdapterViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecipeAdapter.RecipeAdapterViewHolder holder, int position) {
String currentRecipeName = mRecipeName[position];
//Log.v(TAG, "poster path: " + currentPosterPath);
holder.recipeNameTv.setText(currentRecipeName);
}
@Override
public int getItemCount() {
if (null == mRecipeName) return 0;
return mRecipeName.length;
}
public class RecipeAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@BindView(R.id.tv_recipe_name) TextView recipeNameTv;
public RecipeAdapterViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int adapterPosition = getAdapterPosition();
String title = mRecipeName[adapterPosition];
mClickHandler.onClick(title);
}
}
public void setRecipeName(String[] recipeName) {
mRecipeName = recipeName;
notifyDataSetChanged();
}
}
我在适配器中制作了一个接口来处理onClickListener,并在MainActivity中实现了它,fragment的主机活动。但它不起作用。
发布于 2018-08-12 00:33:56
适配器外部的onItemClickListener。首先你需要创建这个类:
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
private OnItemClickListener mListener;
private GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null) {
mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
然后,您必须像这样实现它
recyclerViewClasses.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), recyclerViewClasses, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
RoundedImageView iv_student = view.findViewById(R.id.iv_student);
TextView textView = view.findViewById(R.id.tv_title);
textView.setOnClickListener(view1 -> {
});
iv_student.setOnClickListener(v -> {
});
}
@Override
public void onItemLongClick(View view, int position) {
}
}));
发布于 2018-08-11 22:23:11
在"R.layout.recipe_list_item“中为布局项目提供一个id。然后在RecipeAdapterViewHolder中绑定这个id。因此,在onBindViewHolder中设置listener。示例持有者。(Your_id_name).setOnClickListener
发布于 2018-08-12 00:27:21
在onBindViewHolder中定义onClick不是一种好的做法
正确的方法是在适配器类中声明一个接口,并在活动上实现它,使用接口我们可以传递值
步骤1: OnItemClickListener接口的Decalre侦听器
第二步:声明一个接口,这个接口将把我们点击和数据从适配器转发到我们的活动
然后,Step3在您的片段中定义此接口。full info https://github.com/Eldhopj/recyclerCardViewSample的检查代码
https://stackoverflow.com/questions/51800286
复制相似问题