2017-07-15 109 views
2

我有一些麻煩與我的應用程序。我有與CardView recyclerView。我想打開新的片段與信息的描述...但沒關係。從適配器打開片段RecyclerView

這是我的適配器

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我叫OnRecyclerViewItemClickListener的onClick在MainActivity。

這是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) { 

} 

}

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(); 
} 

}

非常感謝!

+0

你在哪裏賦值的'mClickListener'裏面的片段交易? – PPartisan

回答

1
  1. 通過適配器的構造函數傳遞click監聽器。

    RVAdapter(OnRecyclerViewItemClickListener listener,List<DataJSON> dataList){ 
        mClickListener = listener; 
        this.dataList = dataList; 
    } 
    
  2. 做你CardViewFragment

    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(); 
    
        } 
    } 
    
+0

但是,我必須添加(rvAdapter = new RVAdapter(dataJSONList);)在我的第一個片段與RecyclerView? –

+0

不,您需要在片段或設置適配器的位置實現'OnRecyclerViewItemClickListener',並在創建適配器時傳遞它。試試這個'new RvAdapter(this,dataJSONList);' – santalu

+0

'new RvAdapter(this,dataJSONList);'在我的帶有recyclerView的第一個片段中不起作用 「錯誤:(43,26)錯誤:不兼容的類型:CardViewFragment不能轉換爲OnRecyclerViewItemClickListener「 –

相關問題