我在StackOverflow和其他网站上搜索,但没人能回答我的问题。 我有一个带有项目的gridView。我有一个按钮来向GridView添加项目。GridView上的每个元素都是一个带有Imageview和EditText的relativeLayout。
当我使用按钮向gridView添加项目时,我想获取我的relativeLayout并请求关注editText以在其上设置名称。
想象一下,我的gridView中有3个元素。 我将元素添加到我的ArrayList并调用adapter.notifiyDataSetChanged()。 新元素显示在网格上,但是当我使用getChildCount()时,gridView仍然有3个子元素。
它会导致问题,因为我想请求关注最后添加的EditText。
如何更新我的gridView对象?
片段:
//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"/>
很多!
答案 0 :(得分:1)
When i tried to get my RelativeLayout, null is return : RelativeLayout rl = (RelativeLayout) gridCat.getChildAt(gridCat.getCount()-1);
我认为你的答案是:
添加
时 subcatList.add(new SubCategory());
adapter.notifyDataSetChanged();
到你的代码时,不能保证它们的新视图已被创建,因为你的gridView可能有100个孩子,而你只是看着7到20岁的孩子,所以索引100的新孩子还没有因为getView是在请求时被调用以便节省内存所以当没有必要显示第100个孩子时,为什么必须调用它?所以这个孩子的relativelayout是空的,因为它没有膨胀。
在catAddButton监听器中你不能触摸任何gridview项,因为当按钮点击发生时,它首先运行你的监听器然后滚动到gridView的末尾,所以你仍然有问题,你做什么sholud?
在SubCategory()类中放置变量,表明它第一次没有显示。在gridView的getView中,每次想要膨胀新项目时,请查看该变量(在项目list.get(position)中的SubCategory列表中),例如,如果它是布尔值,则将其切换为false,这意味着新对象是将被用户看到。因此,每当你要对视图进行充气时,你知道如果它是第一次,如果它是第一次你的布尔值为真,那么它已经是假的。如果它不是第一次移除焦点,则通过调用reqesFocuse来放置焦点。