将 JSON 字符串从片段传递到适配器的问题

Posted

技术标签:

【中文标题】将 JSON 字符串从片段传递到适配器的问题【英文标题】:Issue to pass JSON string from fragment to adapter 【发布时间】:2019-01-31 08:13:20 【问题描述】:

我是 android Development 的新手,我试图用项目实现一个列表视图,当一个项目单击它应该显示另一个带有特定项目列表的列表视图,我使用 JSON 字符串值来填充第一个列表查看,在单击项目时,我想传递一个 JSON 字符串,其中包含单击的项目的特定值以列出适配器, 这是可能的代码:

public class MainFragment extends Fragment

ListView raw_List;
FragmentActivity activity;
Data.Raw[] messages;
Functions f;
TextView fname;


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



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View v = inflater.inflate(R.layout.singersfragment, container, false);
    raw_List = (ListView) v.findViewById(R.id.raw_list);
    fname = (TextView) v.findViewById(R.id.title);
    return v;


@Override
public void onActivityCreated(Bundle savedInstanceState) 
    super.onActivityCreated(savedInstanceState);
    activity = this.getActivity();
    f = new Functions(activity);
    Boolean unique = true;
    //set fonts
    fname.setTextSize(f.w(6));


    //get data
    final String json_data_string = getArguments().getString("json_data_string");

    messages = f.getMessages(json_data_string);
    //fill data
    Data.Raw[] messages = this.messages;
    Raw_List_Adapter adapter = new Raw_List_Adapter(activity,  GetUniqueLastNames(messages));
    raw_List.setAdapter(adapter);
    raw_List.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
            //add code here
              Bundle b = new Bundle();;
              b.putString("json_data_string",json_data_string);
              Fragment playpage = Fragment.instantiate(activity, Data_list_Fragment.class.getName(),b);
              FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
              ft.add(R.id.realtabcontent, playpage);
              ft.commit();

        
    );


public static Data.Song[] GetUniqueLastNames(Data.Raw[] messages) 
    Set<Data.Raw> set = new HashSet<Data.Raw>();
    for (int i = 0; i < messages.length; i++) 
        set.add(messages[i]);
    
    return set.toArray(new  Data.Raw[]);

public class Singers_List_Adapter extends ArrayAdapter<Object> 
FragmentActivity activity;
String json_categories_string;
Data.Raw[] messages;
public Singers_List_Adapter(FragmentActivity activity, Data.Raw[] messages) 
    super(activity, 0);
    this.activity = activity;
    this.messages = messages;


@Override
public View getView(final int position, View convertView, ViewGroup parent) 

    LayoutInflater inflator = activity.getLayoutInflater();
    convertView = inflator.inflate(R.layout.raw_item, null);
    TextView raw_title = (TextView) convertView.findViewById(R.id.raw_title);
    SmartImageView raw_image = (SmartImageView) convertView.findViewById(R.id.raw_image);
    raw_title.setText(html.fromHtml(messages[position].amname));
    raw_image.setImageUrl(messages[position].imageurl, activity.getResources().getIdentifier(activity.getResources().getString(R.string.default_image), "drawable", activity.getPackageName()));
    Functions f = new Functions(activity);
    raw_title.setTextSize(f.w(6));

    return convertView;


@Override
public int getCount() 
    return messages.length;


@Override
public Data.Raw getItem(int position) 
    return messages[position];


@Override
public long getItemId(int position) 
    return 0;

当点击 Item 时使用此代码,我将获取所有数据的列表,而不是点击 Item 的特定数据。

【问题讨论】:

【参考方案1】:

您的 onActivityCreated 方法中的项目点击监听器错误:

raw_List.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
        //add code here
          Bundle b = new Bundle();;
          b.putString("json_data_string",json_data_string); // <--- this is the issue
          Fragment playpage = Fragment.instantiate(activity, Data_list_Fragment.class.getName(),b);
          FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
          ft.add(R.id.realtabcontent, playpage);
          ft.commit();

    
);

每当您要从任何适配器获取 itemClickListener 时,然后使用它的侦听器参数来获取数据,例如:

parent.getItemAtPosition(position)

而不是

json_data_string

您需要将其转换为您想要的输出,因为它会返回您的 Object 类型。

所以你的改变将是,

raw_List.setOnItemClickListener(new AdapterView.OnItemClickListener() 
public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
    //add code here
      Bundle b = new Bundle();;
      b.putString("json_data_string",parent.getItemAtPosition(position)); // <--- updated line (Casting needed)
      Fragment playpage = Fragment.instantiate(activity, Data_list_Fragment.class.getName(),b);
      FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
      ft.add(R.id.realtabcontent, playpage);
      ft.commit();

);

查看更多信息: AdapterView.OnItemClickListener

【讨论】:

感谢您的支持,我还有一个问题,因为我必须将类型为 Data.Raw 的 parent.getItemAtPosition(position) 转换为 String,如何在活动的另一个片段上检索数据创建方法并将字符串转换为 Data.Raw[ ] ? 你可以在fragment上创建静态实例方法,也可以在fragment.setArguments(bundle)上将数据传递给bundle。//包含你想要传递的数据

以上是关于将 JSON 字符串从片段传递到适配器的问题的主要内容,如果未能解决你的问题,请参考以下文章

将值从回收器适配器传递到android中的片段

通过适配器在片段之间传递数据(Kotlin Android)

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

数组和适配器不能调用虚空片段

从 recyclerview 的适配器访问父片段方法

具有获取 json 值的片段中的自定义适配器