java - 如何在 notifyDataSetChanged 后检索 GridView 对象?

标签 java android xml gridview notifydatasetchanged

我在 StackOverflow 和其他网站上进行了搜索,但没有人能回答我的问题。 我有一个带有项目的 gridView。我有一个按钮可以将项目添加到此 gridView。GridView 上的每个元素都是一个带有 Imageview 和 EditText 的 relativeLayout。

当我使用按钮将项目添加到 gridView 时,我想获取我的 relativeLayout 并请求 Focus on the editText 以在其上设置名称。

假设我的 gridView 中有 3 个元素。 我将元素添加到我的 ArrayList 并调用 adapter.notifiyDataSetChanged()。 新元素显示在网格上,但是当我使用 getChildCount() 时,gridView 仍然有 3 个子元素。

这会导致问题,因为我想请求关注最后添加的 EditText。

如何更新我的 gridView 对象?

fragment :

//Get gridView
        final GridView gridCat = (GridView) v.findViewById(R.id.gridCategory);
        adapter = new GridCategoryAdapter(getActivity(), subcatList);
        gridCat.setAdapter(adapter);

        gridCat.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                SubCategory subcat = subcatList.get(position);
                FragmentManager manager = getFragmentManager();
                FragmentTransaction transaction = manager.beginTransaction();
                transaction.replace(R.id.fragment_middle, SubCategoryFragment.newInstance(subcat.getProducts(), subcat.getName()));
                transaction.addToBackStack(null);
                transaction.commit();
            }
        });

        Button catAddButton = (Button) v.findViewById(R.id.catAddButton);

        catAddButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "old size gridview : " + gridCat.getChildCount());
                subcatList.add(new SubCategory());
                Log.d(TAG, "new size list : " + subcatList.size());
                adapter.notifyDataSetChanged();
                Log.d(TAG, "new size gridview : " + gridCat.getChildCount());
                //HERE : childCount is the same !
                RelativeLayout rl = (RelativeLayout) gridCat.getChildAt(gridCat.getChildCount()-1);
                rl.findViewById(R.id.subcatName).setFocusable(true);
                rl.findViewById(R.id.subcatName).setLongClickable(true);
                rl.findViewById(R.id.subcatName).requestFocus();
            }
        }); 

我的适配器:

public class GridCategoryAdapter extends BaseAdapter {

    private static final String TAG = "com.zester.manager.ListViewSizeAndPriceAdapter";

    private LayoutInflater mInflater;
    private final Context context;
    private ArrayList<SubCategory> listSubCat;

    private ViewHolder holder;


    public GridCategoryAdapter(Context context, ArrayList<SubCategory> values) {
        super();
        this.context = context;
        listSubCat = values;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return listSubCat.size();
    }

    @Override
    public Object getItem(int position) {
        return listSubCat.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.subcat_view, null);

            holder = new ViewHolder();
            holder.SubCatName = (EditText) convertView.findViewById(R.id.subcatName);
            holder.imageSubCat = (ImageView) convertView.findViewById(R.id.imageSubCatView);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        SubCategory subCat = (SubCategory) getItem(position);
        if (subCat != null) {
            holder.SubCatName.setText(subCat.getName());
            holder.imageSubCat.setImageDrawable(context.getResources().getDrawable(R.drawable.subcat_default));
        }
        return convertView;

    }

    static class ViewHolder {
        public EditText SubCatName;
        public ImageView imageSubCat;
    }

}

gridview 上每个项目的 XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="100dp">

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/imageSubCatView"
        android:src="@drawable/subcat_default"
        android:layout_centerHorizontal="true"/>

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/subcatName"
        android:gravity="center_horizontal"
        android:hint="Ex : Bières"
        android:layout_marginTop="20dp"
        android:layout_below="@+id/imageSubCatView"
        android:background="@android:color/transparent"
        android:singleLine="true"
        android:focusable="false"
        android:longClickable="false"/>

非常感谢!

最佳答案

当我尝试获取我的 RelativeLayout 时,返回 null :RelativeLayout rl = (RelativeLayout) gridCat.getChildAt(gridCat.getCount()-1);

我想你的答案是这样的:

添加时

  subcatList.add(new SubCategory());
  adapter.notifyDataSetChanged();

对于您的代码,不能保证已经为它们创建了新 View ,因为您的 gridView 可能有 100 个 child ,而您只是在查看从 7 到 20 的 child ,因此索引 100 处的新 child 还没有膨胀是因为 getView 是为了节省内存而根据请求调用的,所以当不需要显示第 100 个 child 时,为什么必须调用它?所以那个 child 的 relativelayout 是空的,因为它还没有膨胀。

在 catAddButton 监听器中你不能触摸任何 gridview 项目,因为当按钮点击发生时它首先运行你的监听器然后滚动到 gridView 的末尾所以你仍然有问题,你应该做什么?

在 SubCategory() 的类中放置变量,表明它还没有第一次显示。每次你想在 gridview 的 getView 中膨胀新项目时,看看那个变量(在你的 SubCategory 列表中的 item list.get(position)),例如,如果它是 boolean 值,则将它切换为 false,这意味着新对象是将被用户看到。因此,每次您要以这种方式膨胀 View 时,您都知道这是不是第一次,如果是第一次,您的 boolean 值是 true 否则它已经是 false。如果不是第一次移除焦点,则通过调用 reqesFocuse 放置焦点。

关于java - 如何在 notifyDataSetChanged 后检索 GridView 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25261190/

相关文章:

java - Java 是否可以像 Kotlin 一样创建带有默认参数的方法重载?

java - 附加信息时如何省略 xml 文件中的 header

xml - Bash 将 XML 解析为逗号分隔列表

android - 操作栏中的细进度条

android - jquery mobile + phonegap 构建中的 Youtube iframe

android - 操作栏菜单项

python - 以 UTF-8 格式从 lxml 错误日志中打印消息

java - Android v1p1beta1 语音 - java.lang.NoSuchMethodError : No static method decodeBase64

java - 将源代码转换为 LaTeX

java -version 显示旧的 jdk 1.6 版本