【问题标题】:empty recycler view in FragmentFragment 中的空回收站视图
【发布时间】:2020-07-25 13:56:06
【问题描述】:

我有一个包含 2 个片段的活动

TriFragment.java中,用户输入一个输入并单击按钮Sort对数字进行排序,输入的输入将被发送到第二个片段StepsFragment以在Recyclerview中显示mystepsList。 我检查并发现 mystepsList 是空的,甚至在用户输入数据之前(在创建活动时),所以 recyclerview 没有显示任何内容

主要活动

public class Sorting_activity extends AppCompatActivity  implements StepsFragment.OnFragmentInteractionListener,TriFragment.TriFragmentListner{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sorting_activity);

    TriFragment tri = new TriFragment();

    FragmentManager manager=getSupportFragmentManager();
     manager.beginTransaction()
             .replace(R.id.triLayout,tri ,tri.getTag())
              .commit();

    StepsFragment steps= new StepsFragment();
    manager.beginTransaction()
            .replace(R.id.stepsLayout,steps ,steps.getTag())
            .commit();

}
@Override
public void onFragmentInteraction(Uri uri) { }

@Override
public void onInputsent(String input) {

    StepsFragment.setTextView(input);

}
}

步骤片段

public class StepsFragment extends Fragment  {

private OnFragmentInteractionListener mListener;

private static TextView inputEntred  ;
private RecyclerView RV ;
private Handler mhandler = new Handler();


public StepsFragment() {
    // Required empty public constructor
}
public static void setTextView(String textentered){
    inputEntred.setText(textentered);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

View view =inflater.inflate(R.layout.fragment_steps, container, false);
inputEntred  =view.findViewById(R.id.inputEntred);
String[] numberList = inputEntred.getText().toString().split(","); 
final Integer[] numbers = new Integer[numberList.length];

if(numberList.length !=0){
    // converting the strig array to an array of integers
    for (int i = 0; i < numberList.length; i++) {
        try {
        numbers[i] = Integer.parseInt(numberList[i]);
            }
        catch (NumberFormatException e){
            System.out.println("error is"+e);
        }
                                                 }
 SelectionSort m1 = new SelectionSort();
 ArrayList<String> mystepsList = m1.steps(numbers);// returns the steps numbers
 if(mystepsList.isEmpty()){
   System.out.println("empty list");
   }else {
     for (int i = 0; i < mystepsList.size(); i++)
          {
    System.out.println(mystepsList.get(i));
          }
                            }
    RV =view.findViewById(R.id.RV);
    final StepListAdapter adapter = new StepListAdapter() ;
    RV.setAdapter(adapter);

   LinearLayoutManager llm = new LinearLayoutManager(getActivity());
  RV.setLayoutManager(llm);

  adapter.setList(mystepsList);
            }
    return view;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        //   mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}
public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}

}

适配器

public class StepListAdapter extends RecyclerView.Adapter<StepListAdapter.StepListHolder> {
private ArrayList<String> etapes_list = new ArrayList<String>();


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

@Override
public void onBindViewHolder(@NonNull StepListHolder holder, int position) {
    holder.etapes.setText(etapes_list.get(holder.getAdapterPosition()));
}

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

public void setList(ArrayList<String>  etapes_list ){
    this.etapes_list= etapes_list;

    notifyDataSetChanged();
}

@Override
public long getItemId(int position) {
    return (null != etapes_list ? etapes_list.size() : 0);
}

public class StepListHolder extends RecyclerView.ViewHolder {
    TextView etapes ;
    public StepListHolder(@NonNull View itemView) {
        super(itemView);
        etapes =itemView.findViewById(R.id.txt_log);
    }
}

}

【问题讨论】:

    标签: java android android-studio android-fragments android-recyclerview


    【解决方案1】:

    因为您看到您在 StepsfragmentonCreateView 方法中设置了 recyclerView,这意味着您的计算是在创建片段时完成的,而不是在您实际按下排序按钮时完成。

    以这种方式修改您的片段,您的 recyclerView 将正常工作。

    package com.example;
    
    public class StepsFragment extends Fragment  {
    
    private OnFragmentInteractionListener mListener;
    
    private static TextView inputEntred  ;
    private RecyclerView RV ;
    private Handler mhandler = new Handler();
    
    
    public StepsFragment() {
        // Required empty public constructor
    }
    public static void setTextView(String textentered){
        inputEntred.setText(textentered);
    
        //Set Your recyclerView Here.
        String[] numberList = inputEntred.getText().toString().split(",");
        final Integer[] numbers = new Integer[numberList.length];
    
        if(numberList.length !=0){
            // converting the strig array to an array of integers
            for (int i = 0; i < numberList.length; i++) {
                try {
                    numbers[i] = Integer.parseInt(numberList[i]);
                }
                catch (NumberFormatException e){
                    System.out.println("error is"+e);
                }
            }
            SelectionSort m1 = new SelectionSort();
            ArrayList<String> mystepsList = m1.steps(numbers);// returns the steps numbers
            if(mystepsList.isEmpty()){
                System.out.println("empty list");
            }else {
                for (int i = 0; i < mystepsList.size(); i++)
                {
                    System.out.println(mystepsList.get(i));
                }
            }
    
            final StepListAdapter adapter = new StepListAdapter() ;
            RV.setAdapter(adapter);
    
            LinearLayoutManager llm = new LinearLayoutManager(getActivity());
            RV.setLayoutManager(llm);
    
            adapter.setList(mystepsList);
        }
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
    View view =inflater.inflate(R.layout.fragment_steps, container, false);
    inputEntred  =view.findViewById(R.id.inputEntred);
        RV =view.findViewById(R.id.RV);
    
        return view;
    }
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            //   mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
    

    是的,尽量避免在 Fragment 中设置数据的静态方法。

    【讨论】:

    • 谢谢,这段代码在 setTextView 方法非静态后工作了
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多