【问题标题】:How to getting String from adapter to fragment?如何从适配器获取字符串到片段?
【发布时间】:2019-01-30 08:36:36
【问题描述】:

嗯,我喜欢从适配器解析字符串到片段,我该怎么做?因为我的应用程序上有一个空格字符串。

这是来自我的适配器的代码

适配器

public class listAdapter extends RecyclerView.Adapter<listAdapter.ViewHolder> {
private Simpleway simpleway = new Simpleway();
private ArrayList<DataFirebase> dataList;
private AppCompatActivity someActivity;
private TitleFragment fragmentTitle = new TitleFragment();
private ModelData model = new ModelData();

public listAdapter(ArrayList<DataFirebase> dataList, AppCompatActivity someActivity) {
    this.dataList = dataList;
    this.someActivity = someActivity;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.item_label, viewGroup, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int positions) {
    final DataFirebase labelList = dataList.get(positions);

    viewHolder.textLabel.setText(labelList.getLabel());
    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String enough = labelList.getLabel();
            model.setLabel(enough);
            simpleway.toastMessage(someActivity, model.getLabel());
            someActivity.getSupportFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_right)
                    .replace(R.id.container_layout, fragmentTitle)
                    .addToBackStack(null)
                    .commit();

        }
    });

}


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

public class ViewHolder extends RecyclerView.ViewHolder {
    public LinearLayout linearLabel;
    public TextView textLabel;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        textLabel = itemView.findViewById(R.id.text_label);
        linearLabel = itemView.findViewById(R.id.linearLabel);


    }

}
}

所以大多数情况下,我的适配器代码会打开我的 titlefragment 并使用 pojo 传递字符串,但是我的 pojo 上没有得到任何数据字符串,所以这里看看我的 TitleFragment 类

标题片段

public class TitleFragment extends BaseFragment {

private DatabaseReference databaseReference;
private RecyclerView titleRecycleView;
private ArrayList<DataFirebase> listLabel;
private com.example.parzival.flashcard.adapter.titleAdapter titleAdapter;
private DataFirebase dataFirebase = new DataFirebase();
private ModelData modelData = new ModelData();

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_title, container, false);
    findView(view);
    check();
//        setDataToList(view);
    initListener(view);
    putLayoutManager(view);
    return view;
}

private void check() {
    if (modelData.getLabel().equals("")) {
        simpleway.toastMessage(getContext(), "null");
    } else {
        simpleway.toastMessage(getContext(), modelData.getLabel());
    }
}

private void setDataToList(View view) {
    databaseReference.child(modelData.getLabel()).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            listLabel = new ArrayList<>();

            for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {
                DataFirebase dataText = dataSnap.getValue(DataFirebase.class);
                dataText.setTitle(dataSnap.getKey());
                listLabel.add(dataText);
            }

            titleAdapter = new titleAdapter(listLabel, TitleFragment.this);
            titleRecycleView.setAdapter(titleAdapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            System.out.print(databaseError.getDetails() + "" + databaseError.getMessage());
        }
    });

}

private void putLayoutManager(View view) {
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    titleRecycleView.setLayoutManager(layoutManager);
    titleRecycleView.setItemAnimator(new DefaultItemAnimator());
}

@Override
public void findView(View view) {
    databaseReference = FirebaseDatabase.getInstance().getReference();
    titleRecycleView = view.findViewById(R.id.titleRecycleView);

}

@Override
public void initListener(View view) {

}

}

在我运行唯一的东西后,我从model.getLabel() 得到了一个空对象,怎么办? 我已经在模型上输入了字符串,不是吗?在model.setLabel(enough) 那我为什么会出现这个错误?

编辑

我可能会尝试更多地解释我的活动。主要问题是我正在使用片段来传递数据,并且我也尝试发布一些我的活动类。

列表活动

public class ListActivity extends BaseActivity{

    private DatabaseReference databaseReference;
    private RecyclerView labelRecycleView;
    private ArrayList<DataFirebase> listLabel;
    private listAdapter listAdapter;
    private Button bInput;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        findView();
        setDataToList();
        initListener();
        putLayoutManager();
    }

    private void setDataToList() {
        simpleway.progressDialog(ListActivity.this);
        databaseReference.child("Username").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                listLabel = new ArrayList<>();
                for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {

                    DataFirebase modelClass = dataSnap.getValue(DataFirebase.class);
                    modelClass.setLabel(dataSnap.getKey());
                    listLabel.add(modelClass);
                }
                listAdapter = new listAdapter(listLabel, ListActivity.this);
                labelRecycleView.setAdapter(listAdapter);
                simpleway.stopProgressDialog();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                System.out.println(databaseError.getDetails() + " " + databaseError.getMessage());
                simpleway.stopProgressDialog();
            }
        });
    }

    private void putLayoutManager() {
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        labelRecycleView.setLayoutManager(layoutManager);
        labelRecycleView.setItemAnimator(new DefaultItemAnimator());
    }

    @Override
    public void findView() {
        databaseReference = FirebaseDatabase.getInstance().getReference();
        labelRecycleView = findViewById(R.id.listRecyclerVIew);
        bInput = findViewById(R.id.inputData);
    }


    @Override
    public void initListener() {
        bInput.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                simpleway.startnextActivity(ListActivity.this, InputActivity.class);
            }
        });
    }

   }

我使用 ListActivity 传递的 someActivity 而不是 Fragment 这就是原因

【问题讨论】:

  • 使用接口作为从适配器到片段的回调
  • 您的意思是如何将 onItemClickListener 添加到适配器?
  • 您想从适配器中的字符串中删除空格吗?

标签: android fragment adapter


【解决方案1】:
public interface CallBackListener {
    void onCallBack(String data);// pass any parameter in your onCallBack which you want to return
}

在片段内部创建匿名对象

  CallBackListener listener=new CallBackListener() {

                @Override
                public void onCallBack(String data) {
                    // TODO Auto-generated method stub

                }
            };

从您的适配器传递监听器的引用并在 onClick 内部调用 onCallBack(data);

【讨论】:

    【解决方案2】:

    首先创建一个接口

    public interface PassBack {
        void valueFromAdapter(String value);
    }
    

    然后像这样在你的 Fragment 中实现它

    public class TitleFragment extends BaseFragment implements PassBack{
    
    private DatabaseReference databaseReference;
    private RecyclerView titleRecycleView;
    private ArrayList<DataFirebase> listLabel;
    private com.example.parzival.flashcard.adapter.titleAdapter titleAdapter;
    private DataFirebase dataFirebase = new DataFirebase();
    private ModelData modelData = new ModelData();
    
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
    }
    
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_title, container, false);
        findView(view);
        check();
    //        setDataToList(view);
        initListener(view);
        putLayoutManager(view);
        return view;
    }
    
    private void check() {
        if (modelData.getLabel().equals("")) {
            simpleway.toastMessage(getContext(), "null");
        } else {
            simpleway.toastMessage(getContext(), modelData.getLabel());
        }
    }
    
    private void setDataToList(View view) {
        databaseReference.child(modelData.getLabel()).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                listLabel = new ArrayList<>();
    
                for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {
                    DataFirebase dataText = dataSnap.getValue(DataFirebase.class);
                    dataText.setTitle(dataSnap.getKey());
                    listLabel.add(dataText);
                }
    
                titleAdapter = new titleAdapter(listLabel, TitleFragment.this);
                titleRecycleView.setAdapter(titleAdapter);
            }
    
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                System.out.print(databaseError.getDetails() + "" + databaseError.getMessage());
            }
        });
    
    }
    
    private void putLayoutManager(View view) {
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
        titleRecycleView.setLayoutManager(layoutManager);
        titleRecycleView.setItemAnimator(new DefaultItemAnimator());
    }
    
    @Override
    public void findView(View view) {
        databaseReference = FirebaseDatabase.getInstance().getReference();
        titleRecycleView = view.findViewById(R.id.titleRecycleView);
    
    }
    
    @Override
    public void initListener(View view) {
    
    }
    
    @Override
    public void valueFromAdapter(String value) {
    //here you will get the value 
    }
    
    }
    

    然后在你的适配器中像这样使用它

    public class listAdapter extends RecyclerView.Adapter<listAdapter.ViewHolder> {
    private Simpleway simpleway = new Simpleway();
    private ArrayList<DataFirebase> dataList;
    private AppCompatActivity someActivity;
    private TitleFragment fragmentTitle = new TitleFragment();
    private ModelData model = new ModelData();
    
    public listAdapter(ArrayList<DataFirebase> dataList, AppCompatActivity someActivity) {
        this.dataList = dataList;
        this.someActivity = someActivity;
    }
    
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.item_label, viewGroup, false);
    
        return new ViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int positions) {
        final DataFirebase labelList = dataList.get(positions);
    
        viewHolder.textLabel.setText(labelList.getLabel());
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String enough = labelList.getLabel();
                model.setLabel(enough);
                simpleway.toastMessage(someActivity, model.getLabel());
                someActivity.valueFromAdapter(enough)//this is how you send your value
    
            }
        });
    
    }
    
    
    @Override
    public int getItemCount() {
        return dataList.size();
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder {
        public LinearLayout linearLabel;
        public TextView textLabel;
    
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textLabel = itemView.findViewById(R.id.text_label);
            linearLabel = itemView.findViewById(R.id.linearLabel);
    
    
        }
    
    }
    }
    

    【讨论】:

    • 我尝试实施您的解决方案。但是,当我尝试使用 someActivity 时,我无法调用 valueFromAdapter 方法
    【解决方案3】:

    在您的适配器中

    A.创建接口

    public interface Listener {
      void callback(String data);
    }
    

    B.创建字段

     private Listener listener;
    

    C.在 onCreateViewHolder 上初始化监听器

    listener =  (Listener)viewGroup.getContext()
    

    D.设定值

     String enough = labelList.getLabel();
     listener.callback(enough) // Set the value here
    

    在你的片段中

    (单向)

    1. 实现接口
    2. 在回调方法中可以获取数据。

    (另一种方式)

    1. 在 onCreate 匿名对象中直接实现监听器

    【讨论】:

    • 我在尝试实施您的解决方案时遇到错误java.lang.ClassCastException: com.example.parzival.flashcard.activity.ListActivity cannot be cast to com.example.parzival.flashcard.fragment.PassBack
    • 你得到 ClassCastException 这意味着接口没有正确初始化。从适配器传递上下文并初始化到该接口。这样您就可以看到结果。如果您不喜欢在适配器中传递上下文,只需按照步骤 C 像 listener = (Listener)new TitleFragment()
    【解决方案4】:

    解决方案

    我已经尝试使用已回答的问题并卡住了。我认为它主要用于活动(如果我错了,请纠正我)。所以我通过使用参数来解决这种情况的唯一方法

                String enough = labelList.getLabel();
                TitleFragment titleFragment = new TitleFragment();
                FragmentTransaction fragmentTransaction = someActivity
                        .getSupportFragmentManager()
                        .beginTransaction();
    

    之后我使用 Bundle 来放置一个参数

                Bundle bundle = new Bundle();
                bundle.putString("Check", enough);
                titleFragment.setArguments(bundle);
    

    然后我尝试打开我的片段

                fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, 
    R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_right)
                        .replace(R.id.container_layout, titleFragment)
                        .addToBackStack(null)
                        .commit();
    

    所以我在标题片段上使用参数来获取我的字符串

    private void setDataToList() {
        if (getArguments() != null) {
            String newText = getArguments().getString("Check");
            simpleway.toastMessage(mContext, newText);
        } else {
            simpleway.toastMessage(mContext, "Failed");
        }
    
    }
    

    完成了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多