【问题标题】:How can i change listview from another fragment?如何从另一个片段更改列表视图?
【发布时间】:2015-04-28 11:20:10
【问题描述】:

我的应用程序中有 2 个选项卡。一是联系人,二是收藏夹。

我为每个标签使用 2 个片段和 2 个列表视图。

在我的列表视图中有我想添加选项的名称和星号

该用户可以单击联系人片段中的星号并将用户添加到收藏夹列表视图片段中。

我正在使用自定义适配器。我不知道我该怎么做。

这是我的自定义适配器:

public class ContactsAdapter extends ArrayAdapter<ListViewItem> {

public ContactsAdapter(Context context, List<ListViewItem> items) {
    super(context, R.layout.contacts_list_item, items);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;

    if(convertView == null) {
        // inflate the GridView item layout
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.contacts_list_item, parent, false);

        // initialize the view holder
        viewHolder = new ViewHolder();
        viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.ivIcon);
        viewHolder.ivStarIcon = (ImageView)convertView.findViewById(R.id.FavoriteStarImageView);
        viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
        viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.tvDescription);
        convertView.setTag(viewHolder);
    } else {
        // recycle the already inflated view
        viewHolder = (ViewHolder) convertView.getTag();
    }

    // update the item view
    ListViewItem item = getItem(position);
    if(item.icon != null)
    viewHolder.ivIcon.setImageURI(Uri.parse(item.icon));
    else
    viewHolder.ivIcon.setImageResource(R.drawable.ic_stub);
    viewHolder.tvTitle.setText(item.title);
    viewHolder.tvDescription.setText(item.description);
    if(item.favoriteIcon)
    viewHolder.ivStarIcon.setImageResource(R.drawable.ic_action_important);
    else
    viewHolder.ivStarIcon.setImageResource(R.drawable.ic_action_not_important);
    return convertView;
}

private static class ViewHolder {
    ImageView ivIcon;
    ImageView ivStarIcon;
    TextView tvTitle;
    TextView tvDescription;
}

}

class ListViewItem {
    public final String id;
    public final String icon;       // the drawable for the ListView item ImageView
    public final String title;        // the text for the ListView item title
    public final String description;  // the text for the ListView item description
    public final Boolean favoriteIcon;

    public ListViewItem(String id,String icon, String title, String description, Boolean favoriteIcon) {
        this.id = id;
        this.icon = icon;
        this.title = title;
        this.description = description;
        this.favoriteIcon = favoriteIcon;
    }
}

谢谢

【问题讨论】:

    标签: android listview fragment adapter


    【解决方案1】:
    public class ContactsAdapter extends ArrayAdapter<ListViewItem> implements View.OnClickListener
    {
    
    public ContactsAdapter(Context context, List<ListViewItem> items) {
        super(context, R.layout.contacts_list_item, items);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
    
        if(convertView == null) {
            // inflate the GridView item layout
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.contacts_list_item, parent, false);
    
            // initialize the view holder
            viewHolder = new ViewHolder();
            viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.ivIcon);
            viewHolder.ivStarIcon = (ImageView)convertView.findViewById(R.id.FavoriteStarImageView);
            viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
            viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.tvDescription);
            convertView.setTag(viewHolder);
        } else {
            // recycle the already inflated view
            viewHolder = (ViewHolder) convertView.getTag();
        }
    
        // update the item view
        ListViewItem item = getItem(position);
        if(item.icon != null)
        viewHolder.ivIcon.setImageURI(Uri.parse(item.icon));
        else
        viewHolder.ivIcon.setImageResource(R.drawable.ic_stub);
        viewHolder.tvTitle.setText(item.title);
        viewHolder.tvDescription.setText(item.description);
        if(item.favoriteIcon)
        viewHolder.ivStarIcon.setImageResource(R.drawable.ic_action_important);
        else
        viewHolder.ivStarIcon.setImageResource(R.drawable.ic_action_not_important);
    
        // sets onclick listener for the icon button
        viewHolder.ivStarIcon.setOnClickListener(this);
        return convertView;
    }
    
    @Override
    public void onClick(View v) 
    {
      // TODO add to favorite list fragment
    }
    
    private static class ViewHolder {
        ImageView ivIcon;
        ImageView ivStarIcon;
        TextView tvTitle;
        TextView tvDescription;
    }
    

    然后您可以找到一种方法来获取另一个片段的实例,并在 onclick 方法中对其进行更改。修改列表内容后不要忘记调用notifydatachange

    【讨论】:

    • 将另一个片段(fragment2)的实例传递给您的自定义适配器,然后您在片段2 类中创建一个可能称为“UpdateFavoriteList”的方法。在您的 onclick 方法中调用该方法,例如 getFragment2().UpdateFavoriteList();
    【解决方案2】:

    存在一个包含所有数据的数组(示例代码中的ListViewItem),因此只需将新项目放入该数组并通过调用通知适配器数据集已更改

    notifyDataSetChanged()
    

    【讨论】:

    • 收藏的列表数组和联系人的列表数组不一样,对不起,我不明白你..
    【解决方案3】:

    创建一个回调以从当前片段更新另一个片段。

    interface updatecallback 
    {
      public void updatelist(User user);  //user is the parameter clicked in contacts fragment
    }
    

    在联系人片段的父activity中实现上述接口。

    class parentActivity extends Activity implements updatecallback {
    
    
        //instantiating both fragments with the updatecallback instance
        Fragment f=new FavouritesFragment(favourite_list,this);
        Fragment f=new FavouritesFragment(contact_list,this);
        // other code
        public void updatelist(User user) {
            // update the favourites activity by adding the user to the userlist
            Fragment f=new FavouritesFragment(updated_user_list,this);
        }
    

    联系人片段

     public class ContactFragment extends Fragment 
        {
            private ,updatecallback updatecall;
            public ContactFragment(list,updatecallback updatecall)
            {
                this.updatecall=updatecall;
            }
    
            //while pressing star for a particular contact call in getview 
           ContactAdapter adapter=new ContactAdapter(list,updatecallback updatecall);
    
            }
        }
    

    在接触适配器中

      public class ContactAdapter  extends BaseAdapter
            {
                private ,updatecallback updatecall;
                public ContactAdapter  (list,updatecallback updatecall)
                {
                    this.updatecall=updatecall;
                }
    
                //while pressing star for a particular contact call in getview 
                updatecall.updatecallback(list.get(position));
                }
            }
    

    想法是使用回调将事件填充到另一个片段

    【讨论】:

    • 我该怎么做?!来自我的适配器?!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2020-05-15
    • 2019-09-06
    • 2013-04-15
    • 2020-02-20
    相关资源
    最近更新 更多