android - 从适配器 RecyclerView 打开 fragment

标签 android onclick android-recyclerview fragment

我的应用程序有一些问题。我有 recyclerView 和 CardView。我想打开带有信息描述的新 fragment ......但这没关系。

这是我的适配器

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.DataViewHolder>{

//here
private OnRecyclerViewItemClickListener mClickListener;

public static class DataViewHolder extends RecyclerView.ViewHolder{
    CardView cardView;
    TextView textViewName;
    TextView textViewRegion;

    public DataViewHolder(View itemView) {
        super(itemView);
        cardView = (CardView) itemView.findViewById(R.id.cardView);
        textViewName = (TextView) itemView.findViewById(R.id.textViewName);
        textViewRegion = (TextView) itemView.findViewById(R.id.textViewRegion);
    }
}

private List<DataJSON> dataList;

RVAdapter(List<DataJSON> dataList){
    this.dataList = dataList;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
    DataViewHolder dvh = new DataViewHolder(v);
    return dvh;
}

private DataJSON getItem(int position){
    return dataList.get(position);
}

@Override
public void onBindViewHolder(DataViewHolder holder, final int position) {
    holder.textViewName.setText(dataList.get(position).getPierName());
    holder.textViewRegion.setText(dataList.get(position).getRegion());

    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d("myLog", "Click-clack position " + position);
            if (mClickListener != null){
                Log.d("myLog", "mClickListener != null");
                mClickListener.onClick(position);
            } else {Log.d("myLog", "mClickListener = null");}
        }
    });
}

//here
public interface OnRecyclerViewItemClickListener {
    void onClick(int parameter);
}

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

在 onBindViewHolder 中,我有 onClick,我在 MainActivity 中调用 OnRecyclerViewItemClickListener onClick。

这是 MainActivity。

public class MainActivity extends AppCompatActivity implements RVAdapter.OnRecyclerViewItemClickListener{
private CardViewFragment cardViewFragment;
private DetailFragment detailFragment;

private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("MyTag", "onCreate");

    //Create FragmentManager
    fragmentManager = getSupportFragmentManager();

    //Initialization fragments
    cardViewFragment = new CardViewFragment();
    detailFragment = new DetailFragment();


    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container, cardViewFragment, CardViewFragment.TAG);
    fragmentTransaction.commit();
}

@Override
public void onClick(int parameter) {
    Log.d("myLog", "Hi, from MainActivity");
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container, detailFragment, DetailFragment.TAG);
    fragmentTransaction.commit();
}

我有一个错误,mClickListener 是空对象,理解它, 但我真的不知道,如何解决它。

这是 CardViewFragment

public class CardViewFragment extends Fragment implements RVAdapter.OnRecyclerViewItemClickListener {

public static final String TAG = "CardViewFragment";

private List<DataJSON> dataJSONList;
private RecyclerView recyclerView;
RVAdapter rvAdapter;

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

    dataJSONList = new ArrayList<>();
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setHasFixedSize(true);

    loadDataFromServer();
    //testData();

    rvAdapter = new RVAdapter(this, dataJSONList);
    recyclerView.setAdapter(rvAdapter);

    getActivity();
    return rootView;
}

private void testData(){
    //dataJSONList.add(new DataJSON(0, "RiverIsland", "Moscow", "Moscow is the capital of Russia"));
    //dataJSONList.add(new DataJSON(1, "kek", "Lol", "Scream"));
    DataJSON data2 = new DataJSON(0, "RiverIsland", "Moscow", "Moscow is the capital of Russia");
    dataJSONList.add(data2);
}

String strJson;
private void loadDataFromServer()  {

    AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>(){
        @Override
        protected String doInBackground(Void... voids) {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("https://gesmetrics.ru/testpiers.php").build();
            Response response;

            try {
                response = client.newCall(request).execute();
                strJson = response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return strJson;
        }

        @Override
        protected void onPostExecute(String strJson) {
            super.onPostExecute(strJson);
            Log.d("myLog", strJson);

            //DataJSON data2 = new DataJSON(0, "RiverIsland", "Moscow", "Moscow is the capital of Russia");
            //dataJSONList.add(data2);

            try {
                JSONArray jsonArray = new JSONArray(strJson);
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject object = jsonArray.getJSONObject(i);

                    int id = object.getInt("pierId");
                    String name = object.getString("pierName");
                    String region = object.getString("region");
                    String description = object.getString("description");
                    DataJSON data = new DataJSON(i, name, region, description);
                    //nothing happens here
                    dataJSONList.add(data);
                }
            } catch (JSONException e) {
                System.out.println("Issue");
            }
            rvAdapter.notifyDataSetChanged();
        }

    };
    task.execute();
}

@Override
public void onClick(int parameter) {

}

主要 Activity

public class MainActivity extends AppCompatActivity implements RVAdapter.OnRecyclerViewItemClickListener{
private CardViewFragment cardViewFragment;
private DetailFragment detailFragment;

private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("MyTag", "onCreate");

    //Create FragmentManager
    fragmentManager = getSupportFragmentManager();

    //Initialization fragments
    cardViewFragment = new CardViewFragment();
    detailFragment = new DetailFragment();


    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container, cardViewFragment, CardViewFragment.TAG);
    fragmentTransaction.commit();
}

@Override
public void onClick(int parameter) {
    Log.d("myLog", "Hi, from MainActivity");
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container, detailFragment, DetailFragment.TAG);
    fragmentTransaction.commit();
}

非常感谢!

最佳答案

  1. 通过适配器的构造函数传递点击监听器。

    RVAdapter(OnRecyclerViewItemClickListener listener,List<DataJSON> dataList){
        mClickListener = listener;
        this.dataList = dataList;
    }
    
  2. 在您的CardViewFragment 类中执行 fragment 事务

    public class CardViewFragment extends Fragment implements RVAdapter.OnRecyclerViewItemClickListener {
    
    @Override
    public void onClick(int parameter) {
        //either add fragment
        //getChildFragmentManager().beginTransaction()
        //        .add(new DetailFragment(), null)
        //        .commit();
        //or if you defined any container for DetailFragment(like frame layout) in your fragment layout file which is activity_card_view_fragment.xml just use replace
        getChildFragmentManager().beginTransaction()
                .replace(R.id.container, new DetailFragment())
                .commit();
    
        }
    }
    

关于android - 从适配器 RecyclerView 打开 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45122869/

相关文章:

android - 回收站 View 选择 : stop auto item deselection when touching to the blank space inside the recyclerview

android - 如何防止用户在实现 swipeRefreshLayout 时滚动?

android - ImageView 方法 `setImageState(int[] state, boolean merge)` 有什么作用?

javascript - 单击内部链接时避免转到 block 元素的链接

javascript - 如何在不使用 jQuery 的情况下使用 onclick 函数检查类名

Javascript - 在循环中动态分配 onclick 事件

java - 错误: This class should provide a default constructor (a public constructor with no arguments)

android - 错误:(31,5)使用-sdk:minSdkVersion 9不能小于库中声明的版本14

android - 在使用 Kotlin 为 SQLite 中的列指定类型时,如何使用一组特定的词?

android - 如何在 CollapsingToolbarLayout 中滚动 Recyclerview