我在 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/